1
0
Fork 0

Merge branch 'dev' into 3D

This commit is contained in:
legoboyvdlp R 2020-11-05 19:13:21 +00:00
commit dcbc72b2a7
21 changed files with 1690 additions and 1120 deletions

View file

@ -12,9 +12,48 @@
<author>Josh Davidson/Octal450 (Flight Dynamics, Systems, Displays), Jonathan Redpath/legoboyvdlp, merspieler, Matthew Maring/mattmaring (Systems, Displays), Thorsten Herrmann/TH-555, Semir Gebran/CaptB (3D, Textures)</author>
<authors>
<author>
<name>Josh Davidson</name>
<description>Flight Dynamics, Systems, Displays</description>
<nick>Octal450</nick>
</author>
<author>
<name>Jonathan Redpath</name>
<description>Systems, Displays, FMGC</description>
<nick>legoboyvdlp</nick>
</author>
<author>
<name>merspieler</name>
<description>Systems, Displays</description>
</author>
<author>
<name>Matthew Maring</name>
<description>Fuel predictions, FMGC</description>
<nick>mattmaring</nick>
</author>
<author>
<name>Thorsten Herrmann</name>
<description>Cockpit 3D model</description>
<nick>TH-555</nick>
</author>
<author>
<name>Semir Gebran</name>
<description>3D model</description>
<nick>CaptB</nick>
</author>
<author>
<name>vezza</name>
<description>Systems, Displays</description>
</author>
</authors>
<checklists include="A32X-Checklists.xml"/>
<status>Pre V1.0</status>
<description>Airbus A320</description>
<long-description>The Airbus A320 is a family of narrow body airliners built by Airbus Industrie. First flown in 1987,
the aircraft is the most produced airliner ever, with over 9,500 built to date. It was one of the first airliners
to use digital flight controls and fly by wire, and a fully glass cockpit.</long-description>
<hud n="0">
<enable3d n="0">false</enable3d>
@ -157,6 +196,8 @@
<model type="int">4</model>
</rating>
<status>Pre V1.0</status>
<tags>
<tag>transport</tag>
<tag>airbus</tag>
@ -172,6 +213,13 @@
<tag>2-engine</tag>
</tags>
<urls>
<home-page>http://wiki.flightgear.org/Airbus_A320_Family</home-page>
<support>https://forum.flightgear.org</support>
<wikipedia>https://en.wikipedia.org/wiki/Airbus_A320_family</wikipedia>
<code-repository>https://github.com/legoboyvdlp/A320-family</code-repository>
</urls>
<systems n="0">
<electrical>
<path></path>
@ -534,8 +582,33 @@
</current-view>
<minimum-fg-version>2019.2.0</minimum-fg-version>
<navdb>
<min-runway-length-ft>3000</min-runway-length-ft>
</navdb>
</sim>
<aircraft>
<icao>
<wake-turbulence-category>M</wake-turbulence-category>
<type type="string">A320</type>
<equipment type="string">SDE2FGHIRWXY</equipment>
<surveillance type="string">S</surveillance>
</icao>
<performance>
<minimum>
<takeoff-length-ft type="int">4500</takeoff-length-ft>
<landing-length-ft type="int">4500</landing-length-ft>
</minimum>
<maximum>
<altitude-ft type="int">41000</altitude-ft>
<mach type="double">0.82</mach>
<airspeed-knots type="int">350</airspeed-knots>
</maximum>
</performance>
</aircraft>
<consumables>
<fuel>
<tank n="0">
@ -565,6 +638,39 @@
</fuel>
</consumables>
<ECAM>
<Upper>
<FlapX type="double">0</FlapX>
<FlapY type="double">0</FlapY>
<SlatX type="double">0</SlatX>
<SlatY type="double">0</SlatY>
<FlapXtrans type="double">0</FlapXtrans>
<FlapYtrans type="double">0</FlapYtrans>
<SlatXtrans type="double">0</SlatXtrans>
<SlatYtrans type="double">0</SlatYtrans>
</Upper>
<msg>
<line1 type="string"></line1>
<line2 type="string"></line2>
<line3 type="string"></line3>
<line4 type="string"></line4>
<line5 type="string"></line5>
<line6 type="string"></line6>
<line7 type="string"></line7>
<line8 type="string"></line8>
</msg>
<rightmsg>
<line1 type="string"></line1>
<line2 type="string"></line2>
<line3 type="string"></line3>
<line4 type="string"></line4>
<line5 type="string"></line5>
<line6 type="string"></line6>
<line7 type="string"></line7>
<line8 type="string"></line8>
</rightmsg>
</ECAM>
<environment>
<aircraft-effects>
<frost-inch type="double">0</frost-inch>
@ -1145,6 +1251,7 @@
</comm>
<electrical n="0">
<bus>
<ac-ess type="double">0</ac-ess>
<dc-1 type="double">0</dc-1>
<dc-2 type="double">0</dc-2>
</bus>
@ -1417,6 +1524,7 @@
</pneumatics>
<pressurization>
<cabinalt-norm type="double">0</cabinalt-norm>
<cabinpsi type="double">14.7</cabinpsi>
<ditchingpb type="double">14.7</ditchingpb>
</pressurization>
@ -4304,6 +4412,9 @@
</options>
<nasal>
<notifications>
<file>Aircraft/A320-family/Nasal/emesary/M_frame_notification.nas</file>
</notifications>
<pts>
<file>Aircraft/A320-family/Nasal/Libraries/property-tree-setup.nas</file>
</pts>
@ -4411,6 +4522,7 @@
<file>Aircraft/A320-family/Models/Instruments/ND/canvas/ND.nas</file>
</canvas_nd>
<canvas_ecam>
<file>Aircraft/A320-family/Nasal/emesary/exec.nas</file>
<file>Aircraft/A320-family/Models/Instruments/Upper-ECAM/Upper-ECAM.nas</file>
<file>Aircraft/A320-family/Models/Instruments/Lower-ECAM/Lower-ECAM.nas</file>
</canvas_ecam>

View file

@ -30,6 +30,8 @@ var altimeter_mode = props.globals.getNode("/instrumentation/altimeter[0]/std",
var qnh_hpa = props.globals.getNode("/instrumentation/altimeter/setting-hpa", 1);
var qnh_inhg = props.globals.getNode("/instrumentation/altimeter/setting-inhg", 1);
var _showIESI = 0;
var _fast = 0;
var _IESITime = 0;
var canvas_IESI_base = {
@ -68,8 +70,8 @@ var canvas_IESI_base = {
me.AI_horizon_trans = me["AI_horizon"].createTransform();
me.AI_horizon_rot = me["AI_horizon"].createTransform();
me._showIESI = 0;
me._fast = 0;
_showIESI = 0;
_fast = 0;
_IESITime = 0.0;
me.page = canvas_group;
@ -86,22 +88,22 @@ var canvas_IESI_base = {
# todo 20W power consumption
if (iesi_reset.getValue() == 1) {
if (iesi_init.getBoolValue() and _IESITime + 90 >= et.getValue()) {
me._fast = 1;
_fast = 1;
} else {
me._fast = 0;
_fast = 0;
}
iesi_init.setBoolValue(0);
}
if (systems.ELEC.Bus.dcEss.getValue() >= 25 or (systems.ELEC.Bus.dcHot1.getValue() >= 25 and airspeed.getValue() >= 50 and cur_time >= 5)) {
me._showIESI = 1;
_showIESI = 1;
IESI.update();
if (aconfig.getValue() != 1 and iesi_init.getValue() != 1) {
iesi_init.setBoolValue(1);
if (me._fast) {
if (_fast) {
_IESITime = cur_time - 80;
me._fast = 0;
_fast = 0;
} else {
_IESITime = cur_time;
}
@ -110,11 +112,11 @@ var canvas_IESI_base = {
_IESITime = cur_time - 87;
}
} else {
me._showIESI = 0;
_showIESI = 0;
iesi_init.setBoolValue(0);
}
if (me._showIESI and iesi_brt.getValue() > 0.01) {
if (_showIESI and iesi_brt.getValue() > 0.01) {
IESI.page.show();
} else {
IESI.page.hide();

View file

@ -37,13 +37,13 @@
units="pt"
inkscape:snap-global="false"
showguides="true"
inkscape:current-layer="AI_group"
inkscape:current-layer="svg2"
inkscape:window-maximized="1"
inkscape:window-y="-8"
inkscape:window-x="-8"
inkscape:cy="0.92547661"
inkscape:cx="575.94271"
inkscape:zoom="1.0773413"
inkscape:cy="259.23779"
inkscape:cx="201.84998"
inkscape:zoom="2.56"
showgrid="true"
id="namedview371"
inkscape:window-height="705"
@ -5780,8 +5780,8 @@
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path922"
d="M 13.167811,790.62913 H 154.46853"
style="fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:3.19995;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke" />
d="M 13.167811,790.62913 H 121.24725"
style="fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:3.19994998;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke" />
</g>
<text
xml:space="preserve"

Before

Width:  |  Height:  |  Size: 339 KiB

After

Width:  |  Height:  |  Size: 339 KiB

File diff suppressed because it is too large Load diff

View file

@ -41,9 +41,9 @@
inkscape:window-height="705"
id="namedview371"
showgrid="true"
inkscape:zoom="1"
inkscape:cx="718.57047"
inkscape:cy="505.8628"
inkscape:zoom="0.25"
inkscape:cx="971.41703"
inkscape:cy="1420.8195"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
@ -1428,4 +1428,43 @@
width="137.63597"
id="SlatLine_clip"
style="opacity:0.5;fill:none;fill-opacity:1;stroke:none;stroke-width:3.34691048;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:markers stroke fill" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:31.71383667px;line-height:1.25;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.7928459"
x="38.122616"
y="47.904297"
id="aFloor"
transform="scale(0.94595932,1.0571279)"
inkscape:label="#text1027"><tspan
sodipodi:role="line"
id="tspan1025"
x="38.122616"
y="47.904297"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:39.99999902px;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans';fill:#c56100;fill-opacity:1;stroke-width:0.7928459">A FLOOR</tspan></text>
<text
transform="scale(0.97051272,1.0303832)"
inkscape:label="#text4314"
id="FlxLimTemp"
y="122.78025"
x="919.25299"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#179ab7;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40.71494293px;line-height:1.25;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans';text-align:center;text-anchor:middle;fill:#179ab7;fill-opacity:1;"
y="122.78025"
x="919.25299"
id="tspan1029"
sodipodi:role="line">00</tspan></text>
<text
inkscape:label="#text4443"
id="FlxLimDegreesC"
y="108.14707"
x="1061.88"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#179ab7;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"
transform="scale(0.87983286,1.1365795)"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:31.25978088px;line-height:1.25;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans';fill:#179ab7;fill-opacity:1"
y="108.14707"
x="1061.88"
id="tspan1033"
sodipodi:role="line">°C</tspan></text>
</svg>

Before

Width:  |  Height:  |  Size: 86 KiB

After

Width:  |  Height:  |  Size: 89 KiB

View file

@ -42,8 +42,8 @@
id="namedview371"
showgrid="false"
inkscape:zoom="0.43942712"
inkscape:cx="180.81625"
inkscape:cy="433.53356"
inkscape:cx="623.25944"
inkscape:cy="936.15332"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
@ -1796,4 +1796,43 @@
width="137.63597"
id="SlatLine_clip"
style="opacity:0.5;fill:none;fill-opacity:1;stroke:none;stroke-width:3.34691048;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:markers stroke fill" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:31.71383667px;line-height:1.25;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.7928459"
x="38.122616"
y="47.904297"
id="aFloor"
transform="scale(0.94595932,1.0571279)"
inkscape:label="#text1027"><tspan
sodipodi:role="line"
id="tspan1025"
x="38.122616"
y="47.904297"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:39.99999902px;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans';fill:#c56100;fill-opacity:1;stroke-width:0.7928459">A FLOOR</tspan></text>
<text
transform="scale(0.97051272,1.0303832)"
inkscape:label="#text4314"
id="FlxLimTemp"
y="122.78025"
x="919.25299"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#179ab7;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40.71494293px;line-height:1.25;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans';text-align:center;text-anchor:middle;fill:#179ab7;fill-opacity:1;"
y="122.78025"
x="919.25299"
id="tspan1029"
sodipodi:role="line">00</tspan></text>
<text
inkscape:label="#text4443"
id="FlxLimDegreesC"
y="108.14707"
x="1061.88"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#179ab7;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"
transform="scale(0.87983286,1.1365795)"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:31.25978088px;line-height:1.25;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans';fill:#179ab7;fill-opacity:1"
y="108.14707"
x="1061.88"
id="tspan1033"
sodipodi:role="line">°C</tspan></text>
</svg>

Before

Width:  |  Height:  |  Size: 109 KiB

After

Width:  |  Height:  |  Size: 112 KiB

View file

@ -15,7 +15,7 @@ var overflow = props.globals.initNode("/ECAM/warnings/overflow", 0, "BOOL");
var dc_ess = props.globals.getNode("/systems/electrical/bus/dc-ess", 1);
var lights = [props.globals.initNode("/ECAM/warnings/master-warning-light", 0, "BOOL"), props.globals.initNode("/ECAM/warnings/master-caution-light", 0, "BOOL")];
var aural = [props.globals.initNode("/sim/sound/warnings/crc", 0, "BOOL"), props.globals.initNode("/sim/sound/warnings/chime", 0, "BOOL"), props.globals.initNode("/sim/sound/warnings/cricket", 0, "BOOL"), props.globals.initNode("/sim/sound/warnings/retard", 0, "BOOL")];
var aural = [props.globals.initNode("/sim/sound/warnings/crc", 0, "BOOL"), props.globals.initNode("/sim/sound/warnings/chime", 0, "BOOL"), props.globals.initNode("/sim/sound/warnings/cricket", 0, "BOOL"), props.globals.initNode("/sim/sound/warnings/retard", 0, "BOOL"), props.globals.initNode("/sim/sound/warnings/cchord", 0, "BOOL")];
var warningFlash = props.globals.initNode("/ECAM/warnings/master-warning-flash", 0, "BOOL");
var lineIndex = 0;
@ -31,6 +31,9 @@ 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"),

View file

@ -696,78 +696,24 @@ var messages_priority_3 = func {
}
# C-Chord
if ((pts.Instrumentation.Altimeter.std.getValue() and abs(fcu.altSet.getValue() - getprop("/systems/navigation/adr/output/baro-alt-1-capt")) < 200) or !pts.Instrumentation.Altimeter.std.getValue() and abs(fcu.altSet.getValue() - getprop("/systems/navigation/adr/output/baro-alt-corrected-1-capt")) < 200) {
alt200 = 1;
} else {
alt200 = 0;
}
if ((pts.Instrumentation.Altimeter.std.getValue() and abs(fcu.altSet.getValue() - getprop("/systems/navigation/adr/output/baro-alt-1-capt")) < 750) or !pts.Instrumentation.Altimeter.std.getValue() and abs(fcu.altSet.getValue() - getprop("/systems/navigation/adr/output/baro-alt-corrected-1-capt")) < 750) {
alt750 = 1;
} else {
alt750 = 0;
}
if (FWC.altChg.getValue() or pts.Gear.position[0].getValue() == 1 or (pts.Controls.Gear.gearDown.getValue() and pts.Fdm.JSBsim.Fcs.slatDeg.getValue() > 4) or fmgc.Output.vert.getValue() == 2) {
altAlertInhibit = 1;
} else {
altAlertInhibit = 0;
}
if (alt750 and !alt200 and !altAlertInhibit) {
FWC.Monostable.altAlert2.setValue(1);
} else {
FWC.Monostable.altAlert2.setValue(0);
}
if ((!fcu.ap1.getBoolValue() and !fcu.ap2.getBoolValue()) and FWC.Monostable.altAlert2.getValue()) {
FWC.Monostable.altAlert1.setValue(1);
} else {
FWC.Monostable.altAlert1.setValue(0);
}
if (alt750 and alt200 and !altAlertInhibit) {
setprop("/ECAM/flipflop/alt-alert-2-rs-set", 1);
} else {
setprop("/ECAM/flipflop/alt-alert-2-rs-set", 0);
}
if (getprop("/ECAM/flipflop/alt-alert-rs-reset") or (!alt750 and !alt200 and !altAlertInhibit)) {
setprop("/ECAM/flipflop/alt-alert-2-rs-reset", 1);
} else {
setprop("/ECAM/flipflop/alt-alert-2-rs-reset", 0);
}
if (alt750 and !alt200 and !altAlertInhibit and getprop("/ECAM/flipflop/alt-alert-2-rs-output")) {
setprop("/ECAM/flipflop/alt-alert-3-rs-set", 1);
} else {
setprop("/ECAM/flipflop/alt-alert-3-rs-set", 0);
}
if ((!alt750 and !alt200 and !altAlertInhibit and getprop("/ECAM/flipflop/alt-alert-rs-output")) or (!alt750 and !alt200 and !altAlertInhibit and getprop("/ECAM/flipflop/alt-alert-3-rs-output")) or getprop("/ECAM/flipflop/alt-alert-3-rs-set")) {
bigThree = 1;
} else {
bigThree = 0;
}
if (FWC.Timer.gnd.getValue() != 1 and (FWC.Monostable.altAlert1Output.getValue() or bigThree)) {
if (warningNodes.Logic.altitudeAlert.getValue()) {
if (!getprop("/sim/sound/warnings/cchord-inhibit")) {
setprop("/sim/sound/warnings/cchord", 1);
aural[4].setValue(1);
} else {
setprop("/sim/sound/warnings/cchord", 0);
aural[4].setValue(0);
}
} else {
setprop("/sim/sound/warnings/cchord", 0);
aural[4].setValue(0);
setprop("/sim/sound/warnings/cchord-inhibit", 0);
}
if (FWC.Timer.gnd.getValue() != 1 and getprop("/ECAM/flipflop/alt-alert-3-rs-set") != 1 and alt750 and !alt200 and !altAlertInhibit) {
if (warningNodes.Logic.altitudeAlertSteady.getValue()) {
altAlertSteady = 1;
} else {
altAlertSteady = 0;
}
if (FWC.Timer.gnd.getValue() != 1 and bigThree) {
if (warningNodes.Logic.altitudeAlertFlash.getValue()) {
altAlertFlash = 1;
} else {
altAlertFlash = 0;
@ -1374,10 +1320,10 @@ var messages_priority_2 = func {
ECAM_controller.warningReset(tcasFault);
}
if (warningNodes.Timers.navTerrFault.getValue() == 1 and (phaseVar2 == 2 or phaseVar2 == 6 or phaseVar2 == 7 or phaseVar2 == 9)) {
if (gpwsTerrFault.clearFlag == 0 and warningNodes.Timers.navTerrFault.getValue() == 1 and (phaseVar2 == 2 or phaseVar2 == 6 or phaseVar2 == 7 or phaseVar2 == 9)) {
gpwsTerrFault.active = 1;
if (!getprop("/instrumentation/mk-viii/inputs/discretes/ta-tcf-inhibit")) {
if (gpwsTerrFaultOff.clearFlag == 0 and !getprop("/instrumentation/mk-viii/inputs/discretes/ta-tcf-inhibit")) {
gpwsTerrFaultOff.active = 1;
} else {
ECAM_controller.warningReset(gpwsTerrFaultOff);
@ -2409,7 +2355,7 @@ var messages_memo = func {
if ((phaseVarMemo2 == 1 or phaseVarMemo2 == 2) and toMemoLine1.active != 1 and ldgMemoLine1.active != 1 and (systems.ADIRS.ADIRunits[0].inAlign == 1 or systems.ADIRS.ADIRunits[1].inAlign == 1 or systems.ADIRS.ADIRunits[2].inAlign == 1)) {
irs_in_align.active = 1;
if (getprop("/ECAM/phases/timer/eng1or2-output")) {
if (FWC.Timer.eng1or2Output.getValue()) {
irs_in_align.colour = "a";
} else {
irs_in_align.colour = "g";

View file

@ -2,19 +2,14 @@
# Copyright (c) 2019 Jonathan Redpath (legoboyvdlp)
var twoEngOff = 0;
var myPhase = nil;
var eng = nil;
var eng1epr = nil;
var eng2epr = nil;
var eng1n1 = nil;
var eng2n1 = nil;
var eng1n2 = nil;
var eng2n2 = nil;
var eprlim = nil;
var master1 = nil;
var master2 = nil;
var n1lim = nil;
var gear_agl_cur = nil;
var FWC = {
@ -53,24 +48,28 @@ var FWC = {
Logic: {
gnd: props.globals.getNode("/ECAM/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.initNode("/ECAM/phases/timer/eng1idle", 0, "INT"),
eng2idle: props.globals.initNode("/ECAM/phases/timer/eng2idle", 0, "INT"),
eng1or2: props.globals.initNode("/ECAM/phases/timer/eng1or2", 0, "INT"),
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"),
eng1or2Output: props.globals.initNode("/ECAM/phases/timer/eng1or2-output", 0, "INT"),
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"),
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.initNode("/ECAM/phases/to-power-set", 0, "BOOL"),
altChg: props.globals.getNode("it-autoflight/input/alt-is-changing", 1),
toPower: props.globals.getNode("/ECAM/phases/phase-calculation/takeoff-power"),
altChg: props.globals.getNode("/it-autoflight/input/alt-is-changing", 1),
};
var phaseLoop = func() {
@ -82,53 +81,12 @@ var phaseLoop = func() {
eng2epr = pts.Engines.Engine.eprActual[1].getValue();
eng1n1 = pts.Engines.Engine.n1Actual[0].getValue();
eng2n1 = pts.Engines.Engine.n1Actual[1].getValue();
eng1n2 = pts.Engines.Engine.n2Actual[0].getValue();
eng2n2 = pts.Engines.Engine.n2Actual[1].getValue();
master1 = pts.Controls.Engines.Engine.cutoffSw[0].getBoolValue();
master2 = pts.Controls.Engines.Engine.cutoffSw[1].getBoolValue();
FWC.Flipflop.recallReset.setValue(0);
# Various things
if (eng1n2 >= 59.4 and !master1) {
FWC.Timer.eng1idle.setValue(1);
} else {
FWC.Timer.eng1idle.setValue(0);
}
if (eng2n2 >= 59.4 and !master2) {
FWC.Timer.eng2idle.setValue(1);
} else {
FWC.Timer.eng2idle.setValue(0);
}
if (eng1n2 >= 59.4 or eng2n2 >= 59.4) {
FWC.Timer.eng1or2.setValue(1);
} else {
FWC.Timer.eng1or2.setValue(0);
}
if ((FWC.Timer.eng1idleOutput.getBoolValue() == 0 or master1) and (FWC.Timer.eng2idleOutput.getBoolValue() == 0 or master2)) {
twoEngOff = 1;
} else {
twoEngOff = 0;
}
if (eng == "IAE") {
eprlim = getprop("/controls/engines/epr-limit");
if ((!pts.Controls.Engines.Engine.reverser[0].getBoolValue() and !pts.Controls.Engines.Engine.reverser[1].getBoolValue()) and (((pts.Controls.Engines.Engine.throttle[0].getValue() >= 0.78 or pts.Controls.Engines.Engine.throttle[1].getValue() >= 0.779) and fadec.Thrust.limFlex.getBoolValue()) or (pts.Controls.Engines.Engine.throttle[0].getValue() >= 0.99 or pts.Controls.Engines.Engine.throttle[1].getValue() >= 0.99))) {
FWC.toPower.setBoolValue(1);
} else {
FWC.toPower.setBoolValue(0);
}
} else {
n1lim = getprop("/controls/engines/n1-limit");
if ((!pts.Controls.Engines.Engine.reverser[0].getBoolValue() and !pts.Controls.Engines.Engine.reverser[1].getBoolValue()) and (((pts.Controls.Engines.Engine.throttle[0].getValue() >= 0.78 or pts.Controls.Engines.Engine.throttle[1].getValue() >= 0.779) and fadec.Thrust.limFlex.getBoolValue()) or (pts.Controls.Engines.Engine.throttle[0].getValue() >= 0.99 or pts.Controls.Engines.Engine.throttle[1].getValue() >= 0.99))) {
FWC.toPower.setBoolValue(1);
} else {
FWC.toPower.setBoolValue(0);
}
}
if (myPhase == 9) {
FWC.Monostable.phase9.setBoolValue(1);
@ -149,7 +107,7 @@ var phaseLoop = func() {
FWC.Flipflop.phase10Reset.setBoolValue(0);
}
if ((FWC.Logic.gnd.getBoolValue() and twoEngOff and myPhase == 9) and FWC.Flipflop.phase10Output.getBoolValue()) {
if ((FWC.Logic.gnd.getBoolValue() 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);
@ -171,21 +129,21 @@ var phaseLoop = func() {
gear_agl_cur = pts.Position.gearAglFt.getValue();
# Phase 5 monostable
if (FWC.toPower.getBoolValue() and (gear_agl_cur <= 1500 and !FWC.Logic.gnd.getBoolValue() and FWC.Timer.gnd2Sec.getValue() != 1)) {
if (FWC.toPower.getBoolValue() and (!FWC.Logic.feet1500.getBoolValue() and !FWC.Logic.gnd.getBoolValue() 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 gear_agl_cur <= 1500 and gear_agl_cur <= 800 and !FWC.Logic.gnd.getBoolValue() and FWC.Timer.gnd2Sec.getValue() != 1) {
if (!FWC.toPower.getBoolValue() and !FWC.Logic.feet1500.getBoolValue() and !FWC.Logic.feet800.getBoolValue() and !FWC.Logic.gnd.getBoolValue() and FWC.Timer.gnd2Sec.getValue() != 1) {
FWC.Monostable.phase7.setBoolValue(1);
} else {
FWC.Monostable.phase7.setBoolValue(0);
}
# Actual Phases
if ((!FWC.Logic.gnd.getBoolValue() and FWC.Timer.gnd2Sec.getValue() != 1 and twoEngOff and myPhase != 9) and !FWC.Monostable.phase1Output.getBoolValue()) {
if ((!FWC.Logic.gnd.getBoolValue() and FWC.Timer.gnd2Sec.getValue() != 1 and FWC.Timer.eng1and2Off.getValue() and myPhase != 9) and !FWC.Monostable.phase1Output.getBoolValue()) {
setPhase(1);
}
@ -205,7 +163,7 @@ var phaseLoop = func() {
setPhase(5);
}
if (!FWC.Logic.gnd.getValue() and FWC.Timer.gnd2Sec.getValue() != 1 and !(FWC.Monostable.phase5.getBoolValue() and FWC.Monostable.phase5Output.getBoolValue()) and !(FWC.Monostable.phase7.getBoolValue() and FWC.Monostable.phase7Output.getBoolValue())) {
if (!FWC.Logic.gnd.getValue() 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())) {
setPhase(6);
}
@ -221,7 +179,7 @@ var phaseLoop = func() {
setPhase(9);
}
if ((FWC.Logic.gnd.getBoolValue() and twoEngOff and myPhase == 9) and FWC.Monostable.phase1Output.getBoolValue()) {
if ((FWC.Logic.gnd.getBoolValue() and FWC.Timer.eng1and2Off.getValue() and myPhase == 9) and FWC.Monostable.phase1Output.getBoolValue()) {
setPhase(10);
}

View file

@ -245,6 +245,7 @@ var postInit = func() {
var FMGCNodes = {
costIndex: props.globals.initNode("/FMGC/internal/cost-index", 0, "DOUBLE"),
flexSet: props.globals.initNode("/FMGC/internal/flex-set", 0, "BOOL"),
flexTemp: props.globals.initNode("/FMGC/internal/flex", 0, "INT"),
mngSpdAlt: props.globals.getNode("/FMGC/internal/mng-alt-spd"),
mngMachAlt: props.globals.getNode("/FMGC/internal/mng-alt-mach"),
toFromSet: props.globals.initNode("/FMGC/internal/tofrom-set", 0, "BOOL"),

View file

@ -80,8 +80,11 @@ var SimbriefParser = {
if (departures != nil and size(departures) != 0 and destinations != nil and size(destinations) != 0) {
fmgc.flightPlanController.flightplans[3].departure = departures[0];
fmgc.flightPlanController.flightplans[3].destination = destinations[0];
fmgc.FMGCInternal.arrApt = destinationID;
fmgc.FMGCInternal.depApt = departureID;
fmgc.FMGCInternal.arrApt = destinationID;
atsu.ATISInstances[0].newStation(departureID);
atsu.ATISInstances[1].newStation(destinationID);
fmgc.FMGCInternal.toFromSet = 1;
fmgc.FMGCNodes.toFromSet.setValue(1);
@ -107,6 +110,7 @@ var SimbriefParser = {
var alternates = findAirportsByICAO(alternateID);
if (alternates != nil and size(alternates) != 0) {
fmgc.FMGCInternal.altAirport = alternateID;
atsu.ATISInstances[2].newStation(alternateID);
fmgc.FMGCInternal.altAirportSet = 1;
}

View file

@ -37,7 +37,7 @@ var createCanvasQRH = func() {
qrhCanvas.setLayout(myHBox);
QRH = canvas.gui.widgets.Label.new(root, canvas.style, {} )
.setImage("Aircraft/A320-family/Models/FlightDeck/QRH/" ~ QRHpageNo.getValue() ~ ".jpeg")
.setImage(resolvepath("Aircraft/A320-family/Models/FlightDeck/QRH/" ~ QRHpageNo.getValue() ~ ".jpeg"))
.move(0,-25)
.setSize(400,625);
myHBox.addItem(QRH);
@ -78,11 +78,11 @@ var createCanvasQRH = func() {
});
buttonPrev.listen("clicked", func {
prevPage();
QRH.setImage("Aircraft/A320-family/Models/FlightDeck/QRH/" ~ QRHpageNo.getValue() ~ ".jpeg");
QRH.setImage(resolvepath("Aircraft/A320-family/Models/FlightDeck/QRH/" ~ QRHpageNo.getValue() ~ ".jpeg"));
});
buttonNext.listen("clicked", func {
nextPage();
QRH.setImage("Aircraft/A320-family/Models/FlightDeck/QRH/" ~ QRHpageNo.getValue() ~ ".jpeg");
QRH.setImage(resolvepath("Aircraft/A320-family/Models/FlightDeck/QRH/" ~ QRHpageNo.getValue() ~ ".jpeg"));
});

View file

@ -330,7 +330,7 @@ var ATIS = {
},
processATIS: func(r, i) {
var raw = r.response;
if (r.response == "FBW_ERROR: D-ATIS not available at this airport") {
if (r.response == "FBW_ERROR: D-ATIS not available at this airport" or find("atis not avail",r.response) != -1) {
me.received = 0;
me.sent = 0;
mcdu.mcdu_message(i,"NO D-ATIS AVAILABLE");

View file

@ -28,9 +28,9 @@ var FADEC = {
eng1Time: props.globals.initNode("/systems/fadec/eng1-master-time", -300, "DOUBLE"),
eng1Off: props.globals.initNode("/systems/fadec/eng1-off-power", 0, "BOOL"),
eng1Counting: 0,
epr: 0,
epr: props.globals.initNode("/systems/fadec/eng1/epr", 0, "BOOL"),
egt: 0,
n1: 0,
n1: props.globals.initNode("/systems/fadec/eng1/n1", 0, "BOOL"),
n2: 0,
ff: 0,
},
@ -38,9 +38,9 @@ var FADEC = {
eng2Time: props.globals.initNode("/systems/fadec/eng2-master-time", -300, "DOUBLE"),
eng2Off: props.globals.initNode("/systems/fadec/eng2-off-power", 0, "BOOL"),
eng2Counting: 0,
epr: 0,
epr: props.globals.initNode("/systems/fadec/eng2/epr", 0, "BOOL"),
egt: 0,
n1: 0,
n1: props.globals.initNode("/systems/fadec/eng2/n1", 0, "BOOL"),
n2: 0,
ff: 0,
},
@ -147,24 +147,24 @@ var FADEC = {
powerup = me.Power.powerup.getValue();
if (powered1 or powerup or me.Eng1.eng1Off.getValue()) {
me.Eng1.n1 = 1;
me.Eng1.n1.setValue(1);
me.Eng1.n2 = 1;
me.Eng1.egt = 1;
me.Eng1.ff = 1;
} else {
me.Eng1.n1 = 0;
me.Eng1.n1.setValue(0);
me.Eng1.n2 = 0;
me.Eng1.egt = 0;
me.Eng1.ff = 0;
}
if (powered2 or powerup or me.Eng2.eng2Off.getValue()) {
me.Eng2.n1 = 1;
me.Eng2.n1.setValue(1);
me.Eng2.n2 = 1;
me.Eng2.egt = 1;
me.Eng2.ff = 1;
} else {
me.Eng2.n1 = 0;
me.Eng2.n1.setValue(0);
me.Eng2.n2 = 0;
me.Eng2.egt = 0;
me.Eng2.ff = 0;

View file

@ -25,9 +25,9 @@ var FADEC = {
eng1Time: props.globals.initNode("/systems/fadec/eng1-master-time", -300, "DOUBLE"),
eng1Off: props.globals.initNode("/systems/fadec/eng1-off-power", 0, "BOOL"),
eng1Counting: 0,
epr: 0,
epr: props.globals.initNode("/systems/fadec/eng1/epr", 0, "BOOL"),
egt: 0,
n1: 0,
n1: props.globals.initNode("/systems/fadec/eng1/n1", 0, "BOOL"),
n2: 0,
ff: 0,
},
@ -35,9 +35,9 @@ var FADEC = {
eng2Time: props.globals.initNode("/systems/fadec/eng2-master-time", -300, "DOUBLE"),
eng2Off: props.globals.initNode("/systems/fadec/eng2-off-power", 0, "BOOL"),
eng2Counting: 0,
epr: 0,
epr: props.globals.initNode("/systems/fadec/eng2/epr", 0, "BOOL"),
egt: 0,
n1: 0,
n1: props.globals.initNode("/systems/fadec/eng2/n1", 0, "BOOL"),
n2: 0,
ff: 0,
},
@ -148,28 +148,28 @@ var FADEC = {
if (powered1 or powerup or me.Eng1.eng1Off.getValue()) {
if (me.Modes.n1Mode1.getValue() == 0) {
me.Eng1.epr = 1;
me.Eng1.epr.setValue(1);
} else {
me.Eng1.epr = 0;
me.Eng1.epr.setValue(0);
}
me.Eng1.egt = 1;
me.Eng1.ff = 1;
} else {
me.Eng1.epr = 0;
me.Eng1.epr.setValue(0);
me.Eng1.egt = 0;
me.Eng1.ff = 0;
}
if (powered2 or powerup or me.Eng2.eng2Off.getValue()) {
if (me.Modes.n1Mode2.getValue() == 0) {
me.Eng2.epr = 1;
me.Eng2.epr.setValue(1);
} else {
me.Eng2.epr = 0;
me.Eng2.epr.setValue(0);
}
me.Eng2.egt = 1;
me.Eng2.ff = 1;
} else {
me.Eng2.epr = 0;
me.Eng2.epr.setValue(0);
me.Eng2.egt = 0;
me.Eng2.ff = 0;
}
@ -180,15 +180,15 @@ var FADEC = {
N22 = pts.Engines.Engine.n2Actual[1].getValue();
if (powered1 and N11 >= 3.5) {
me.Eng1.n1 = 1;
me.Eng1.n1.setValue(1);
} else {
me.Eng1.n1 = 0;
me.Eng1.n1.setValue(0);
}
if (powered2 and N12 >= 3.5) {
me.Eng2.n1 = 1;
me.Eng2.n1.setValue(1);
} else {
me.Eng2.n1 = 0;
me.Eng2.n1.setValue(0);
}
if (powered1 and N21 >= 3.5) {

View file

@ -0,0 +1,98 @@
#---------------------------------------------------------------------------
#
# Title : Emesary based rt exec frame notifications
#
# File Type : Implementation File
#
# Description : Uses emesary notifications to permit nasal subsystems to be notified each frame.
# : A frame is defined by the timer rate; which is usually the maximum rate as determined by the FPS.
# : This is an alternative to the timer based or explicit function calling way of invoking
# : aircraft systems.
# : It has the advantage of using less timers and remaining modular, as each aircraft subsytem
# : can simply register itself with the global transmitter to receive the frame notification.
#
# Author : Richard Harrison (richard@zaretto.com)
#
# Creation Date : 4 June 2018
#
# Version : 1.0
#
# Copyright (C) 2018 Richard Harrison Released under GPL V2
#
#---------------------------------------------------------------------------*/
var FrameNotification =
{
debug: 0,
new: func(_rate)
{
var new_class = emesary.Notification.new("FrameNotification", _rate);
new_class.Rate = _rate;
new_class.FrameRate = 60;
new_class.FrameCount = 0;
new_class.ElapsedSeconds = 0;
new_class.monitored = {};
new_class.properties = {};
#
# embed a recipient within this notification to allow the monitored property
# mapping list to be modified.
new_class.Recipient = emesary.Recipient.new("FrameNotification");
new_class.Recipient.Receive = func(notification)
{
if (notification.NotificationType == "FrameNotificationAddProperty")
{
var root_node = props.globals;
if (notification.root_node != nil) {
root_node = notification.root_node;
}
if (new_class.properties[notification.property] != nil
and new_class.properties[notification.property] != notification.variable)
print("[WARNING]: (",notification.module,") FrameNotification: already have variable ",new_class.properties[notification.property]," for ",notification.variable, " referencing property ",notification.property);
if (new_class.monitored[notification.variable] != nil
and new_class.monitored[notification.variable].getPath() != notification.property
and new_class.monitored[notification.variable].getPath() != "/"~notification.property)
print("[WARNING]: (",notification.module,") FrameNotification: already have variable ",notification.variable,"=",new_class.monitored[notification.variable].getPath(), " using different property ",notification.property);
# else if (new_class.monitored[notification.variable] == nil)
# print("[INFO]: (",notification.module,") FrameNotification.",notification.variable, " = ",notification.property);
new_class.monitored[notification.variable] = root_node.getNode(notification.property,1);
new_class.properties[notification.property] = notification.variable;
return emesary.Transmitter.ReceiptStatus_OK;
}
return emesary.Transmitter.ReceiptStatus_NotProcessed;
};
new_class.fetchvars = func() {
foreach (var mp; keys(new_class.monitored)){
if(new_class.monitored[mp] != nil){
if (FrameNotification.debug > 1)
print(" ",mp, " = ",new_class.monitored[mp].getValue());
new_class[mp] = new_class.monitored[mp].getValue();
}
}
};
emesary.GlobalTransmitter.Register(new_class.Recipient);
return new_class;
},
};
var FrameNotificationAddProperty =
{
new: func(module, variable, property, root_node=nil)
{
var new_class = emesary.Notification.new("FrameNotificationAddProperty", variable);
if (root_node == nil)
root_node = props.globals;
new_class.module = module ;
new_class.variable = variable;
new_class.property = property;
new_class.root_node = root_node;
return new_class;
},
};
#
var frameNotification = FrameNotification.new(1);

71
Nasal/emesary/exec.nas Normal file
View file

@ -0,0 +1,71 @@
#---------------------------------------------------------------------------
#
# Title : Emesary based real time executive
#
# File Type : Implementation File
#
# Description : Uses emesary notifications to permit nasal subsystems to
# : be invoked in a controlled manner.
#
# Author : Richard Harrison (richard@zaretto.com)
#
# Creation Date : 4 June 2018
#
# Version : 1.0
#
# Copyright (C) 2018 Richard Harrison Released under GPL V2
#
#---------------------------------------------------------------------------*/
#
# real time exec loop.
var frame_inc = 0;
var cur_frame_inc = 0.05;
var execLoop = func
{
#
notifications.frameNotification.fetchvars();
if (notifications.frameNotification.FrameCount >= 4) {
notifications.frameNotification.FrameCount = 0;
}
emesary.GlobalTransmitter.NotifyAll(notifications.frameNotification);
#
notifications.frameNotification.FrameCount = notifications.frameNotification.FrameCount + 1;
if (notifications.frameNotification.frame_rate < 5) {
frame_inc = 0.25;#4 Hz
} elsif (notifications.frameNotification.frame_rate < 10) {
frame_inc = 0.125;#8 Hz
} elsif (notifications.frameNotification.frame_rate < 15) {
frame_inc = 0.10;#10 Hz
} elsif (notifications.frameNotification.frame_rate < 20) {
frame_inc = 0.075;#13.3 Hz
} elsif (notifications.frameNotification.frame_rate < 25) {
frame_inc = 0.05;#20 Hz
} elsif (notifications.frameNotification.frame_rate < 40) {
frame_inc = 0.0333;#30 Hz
} else {
frame_inc = 0.02;#50 Hz
}
if (frame_inc != cur_frame_inc) {
cur_frame_inc = frame_inc;
}
settimer(execLoop, cur_frame_inc);
}
# setup the properties to monitor for this system
input = {
frame_rate : "/sim/frame-rate",
elapsed_seconds : "/sim/time/elapsed-sec",
};
foreach (var name; keys(input)) {
emesary.GlobalTransmitter.NotifyAll(notifications.FrameNotificationAddProperty.new("EXEC", name, input[name]));
}
emesary.GlobalTransmitter.OverrunDetection(9);
setlistener("/sim/signals/fdm-initialized", func() {
execLoop();
}, 0, 0);

View file

@ -466,7 +466,7 @@
/gear/gear[1]/wow eq 1
/systems/air-conditioning/landing-switch eq 1
/velocities/airspeed-kt lt 70
/ECAM/phases/to-power-set ne 1
/ECAM/phases/phase-calculation/takeoff-power ne 1
</test>
</switch>
@ -474,7 +474,7 @@
<default value="/systems/air-conditioning/packs/pack-flow-1-norm"/>
<test logic="AND" value="0">
/gear/gear[1]/wow eq 1
/ECAM/phases/to-power-set eq 1
/ECAM/phases/phase-calculation/takeoff-power eq 1
</test>
<test logic="AND" value="0">
/gear/gear[1]/wow eq 1
@ -507,7 +507,7 @@
<default value="/systems/air-conditioning/packs/pack-flow-2-norm"/>
<test logic="AND" value="0">
/gear/gear[1]/wow eq 1
/ECAM/phases/to-power-set eq 1
/ECAM/phases/phase-calculation/takeoff-power eq 1
</test>
<test logic="AND" value="0">
/gear/gear[1]/wow eq 1

View file

@ -12,6 +12,19 @@
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">1</rate_limit> <!-- 1 second -->
</actuator>
<actuator name="/ECAM/phases/phase-calculation/engine-1-or-2-running">
<input>/ECAM/phases/phase-calculation/one-engine-running</input>
<rate_limit sense="decr">120</rate_limit>
<rate_limit sense="incr">0.03333333333</rate_limit>
</actuator>
<actuator name="/ECAM/phases/monostable/phase-1-300-output">
<input>/ECAM/phases/monostable/phase-1-300</input>
<rate_limit sense="incr">0.00333333333</rate_limit>
<rate_limit sense="decr">120</rate_limit>
</actuator>
</channel>
<channel name="FWC Phase Logic and Switches" execrate="4">
@ -80,12 +93,6 @@
</test>
</switch>
<actuator name="/ECAM/phases/monostable/phase-1-300-output">
<input>/ECAM/phases/monostable/phase-1-300</input>
<rate_limit sense="incr">0.00333333333</rate_limit>
<rate_limit sense="decr">120</rate_limit>
</actuator>
<switch name="/ECAM/phases/monostable/phase-1-300-output">
<default value="0"/>
<test logic="AND" value="1">
@ -93,6 +100,135 @@
/ECAM/phases/monostable/phase-1-300 eq 1
</test>
</switch>
<switch name="/ECAM/phases/phase-calculation/altitude-ge-1500">
<default value="0"/>
<test logic="AND" value="1">
/position/gear-agl-ft ge 1500
</test>
</switch>
<switch name="/ECAM/phases/phase-calculation/altitude-flipflop-set">
<default value="0"/>
<test logic="AND" value="1">
/ECAM/phases/phase-calculation/altitude-ge-1500 eq 1
</test>
</switch>
<switch name="/ECAM/phases/phase-calculation/altitude-flipflop-reset">
<default value="0"/>
<test logic="AND" value="1">
/position/gear-agl-ft lt 800
</test>
</switch>
</channel>
<channel name="Phase Calcs" execrate="4">
<switch name="/ECAM/phases/timer/eng1idle">
<default value="0"/>
<test logic="AND" value="1">
/engines/engine[0]/n2 ge 59.4
/controls/engines/engine[0]/cutoff-switch eq 0
</test>
</switch>
<switch name="/ECAM/phases/timer/eng2idle">
<default value="0"/>
<test logic="AND" value="1">
/engines/engine[1]/n2 ge 59.4
/controls/engines/engine[1]/cutoff-switch eq 0
</test>
</switch>
<switch name="/ECAM/phases/phase-calculation/engine-1-off">
<default value="0"/>
<test logic="AND" value="1">
<test logic="OR">
/ECAM/phases/timer/eng1idle-output eq 0
/controls/engines/engine[0]/cutoff-switch eq 1
</test>
<test logic="OR">
/ECAM/timer/ground-calc eq 1
/ECAM/phases/timer/eng1idle eq 0
</test>
</test>
</switch>
<switch name="/ECAM/phases/phase-calculation/engine-2-off">
<default value="0"/>
<test logic="AND" value="1">
<test logic="OR">
/ECAM/phases/timer/eng2idle-output eq 0
/controls/engines/engine[1]/cutoff-switch eq 1
</test>
<test logic="OR">
/ECAM/timer/ground-calc eq 1
/ECAM/phases/timer/eng2idle eq 0
</test>
</test>
</switch>
<switch name="/ECAM/phases/phase-calculation/engines-1-2-not-running">
<default value="0"/>
<test logic="AND" value="1">
/ECAM/phases/phase-calculation/engine-1-off eq 1
/ECAM/phases/phase-calculation/engine-2-off eq 1
</test>
</switch>
<switch name="/ECAM/phases/phase-calculation/one-engine-running">
<default value="0"/>
<test logic="OR" value="1">
/engines/engine[0]/state eq 3
/engines/engine[1]/state eq 3
</test>
</switch>
<switch name="/ECAM/phases/phase-calculation/takeoff-power-logic">
<default value="0"/>
<test logic="OR" value="1">
<test logic="OR">
<test logic="AND">
/controls/engines/engine[0]/throttle ge 0.779
/systems/thrust/lim-flex eq 1
</test>
<test logic="AND">
/controls/engines/engine[0]/throttle ge 0.99
/systems/thrust/lim-flex eq 0
</test>
</test>
<test logic="OR">
<test logic="AND">
/controls/engines/engine[1]/throttle ge 0.779
/systems/thrust/lim-flex eq 1
</test>
<test logic="AND">
/controls/engines/engine[1]/throttle ge 0.99
/systems/thrust/lim-flex eq 0
</test>
</test>
</test>
</switch>
<actuator name="/ECAM/phases/phase-calculation/takeoff-power-timer">
<input>/ECAM/phases/phase-calculation/takeoff-power-logic</input>
<rate_limit sense="incr">120</rate_limit>
<rate_limit sense="decr">0.01666666666</rate_limit>
</actuator>
<switch name="/ECAM/phases/phase-calculation/takeoff-power">
<default value="0"/>
<test logic="OR" value="1">
/ECAM/phases/phase-calculation/takeoff-power-logic eq 1
<test logic="AND">
/ECAM/phases/phase-calculation/takeoff-power-timer ne 0
/ECAM/phases/phase-calculation/altitude-ge-1500 eq 0
/controls/engines/engine[0]/throttle ge 0.599
/controls/engines/engine[1]/throttle ge 0.599
</test>
</test>
</switch>
</channel>
</system>

View file

@ -21,13 +21,6 @@
<rate_limit sense="incr">0.033</rate_limit> <!-- 30 seconds -->
</actuator>
<actuator name="/ECAM/phases/timer/eng1or2-output">
<description>Timer for the ECAM system</description>
<input>/ECAM/phases/timer/eng1or2</input>
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.033</rate_limit> <!-- 30 seconds -->
</actuator>
<actuator name="/ECAM/phases/timer/to-inhibit-output">
<description>Timer for the ECAM system</description>
<input>/ECAM/phases/timer/to-inhibit</input>
@ -1805,7 +1798,7 @@
<default value="0"/>
<test logic="AND" value="1">
/controls/engines/engine[0]/throttle-lever ge 0.13333333333
/ECAM/phases/to-power-set eq 0
/ECAM/phases/phase-calculation/takeoff-power eq 0
</test>
</switch>
@ -1858,7 +1851,7 @@
<default value="0"/>
<test logic="AND" value="1">
/controls/engines/engine[1]/throttle-lever ge 0.13333333333
/ECAM/phases/to-power-set eq 0
/ECAM/phases/phase-calculation/takeoff-power eq 0
</test>
</switch>
@ -2063,7 +2056,7 @@
/instrumentation/radar-altimeter[0]/radar-altitude-ft lt 750
/instrumentation/radar-altimeter[1]/radar-altitude-ft lt 750
</test>
/ECAM/phases/to-power-set eq 0
/ECAM/phases/phase-calculation/takeoff-power eq 0
<test logic="OR">
fcs/slat-pos-deg gt 16
fcs/flap-pos-deg gt 18
@ -2099,7 +2092,7 @@
/instrumentation/radar-altimeter[0]/radar-altitude-ft lt 750
/instrumentation/radar-altimeter[1]/radar-altitude-ft lt 750
</test>
/ECAM/phases/to-power-set eq 0
/ECAM/phases/phase-calculation/takeoff-power eq 0
<test logic="OR">
/gear/gear[0]/position-norm ne 1
/gear/gear[1]/position-norm ne 1
@ -2379,4 +2372,188 @@
</channel>
<channel name="Altitude Alerter" execrate="8">
<switch name="/ECAM/warnings/altitude-alert/altInhibit">
<default value="0"/>
<test logic="OR" value="1">
/it-autoflight/input/alt-is-changing eq 1
<test logic="OR">
<test logic="AND">
/gear/gear[1]/position-norm ge 0.99
/gear/gear[2]/position-norm ge 0.99
</test>
<test logic="AND">
/controls/gear/gear-down eq 1
/fdm/jsbsim/fcs/slat-pos-deg ge 4
</test>
</test>
/it-autoflight/output/lat eq 4
/it-autoflight/output/vert eq 2
/it-autoflight/output/vert eq 6
<!-- /it-autoflight/output/vert eq 7 check -->
</test>
</switch>
<fcs_function name="/ECAM/warnings/altitude-alert/altitude-difference">
<function>
<ifthen>
<not><property>/instrumentation/altimeter[0]/std</property></not>
<abs>
<difference>
<property>/systems/navigation/adr/output/baro-alt-corrected-1-capt</property>
<property>/it-autoflight/input/alt</property>
</difference>
</abs>
<abs>
<difference>
<property>/systems/navigation/adr/output/baro-alt-1-capt</property>
<property>/it-autoflight/input/alt</property>
</difference>
</abs>
</ifthen>
</function>
</fcs_function>
<switch name="/ECAM/warnings/altitude-alert/alt200">
<default value="0"/>
<test logic="OR" value="1">
/ECAM/warnings/altitude-alert/altitude-difference le 200
</test>
</switch>
<switch name="/ECAM/warnings/altitude-alert/alt750">
<default value="0"/>
<test logic="OR" value="1">
/ECAM/warnings/altitude-alert/altitude-difference le 750
</test>
</switch>
<switch name="/ECAM/warnings/altitude-alert/big-3-1-off">
<default value="0"/>
<test logic="AND" value="1">
/ECAM/warnings/altitude-alert/altInhibit eq 0
/ECAM/warnings/altitude-alert/alt200 eq 1
/ECAM/warnings/altitude-alert/alt750 eq 1
</test>
</switch>
<switch name="/ECAM/warnings/altitude-alert/big-3-2-off">
<default value="0"/>
<test logic="AND" value="1">
/ECAM/warnings/altitude-alert/altInhibit eq 0
/ECAM/warnings/altitude-alert/alt200 eq 0
/ECAM/warnings/altitude-alert/alt750 eq 1
</test>
</switch>
<switch name="/ECAM/warnings/altitude-alert/big-3-all-off">
<default value="0"/>
<test logic="AND" value="1">
/ECAM/warnings/altitude-alert/altInhibit eq 0
/ECAM/warnings/altitude-alert/alt200 eq 0
/ECAM/warnings/altitude-alert/alt750 eq 0
</test>
</switch>
<switch name="/ECAM/warnings/altitude-alert/flipflop-1-set">
<default value="0"/>
<test logic="OR" value="1">
/ECAM/warnings/altitude-alert/big-3-1-off eq 1
</test>
</switch>
<switch name="/ECAM/warnings/altitude-alert/flipflop-1-reset">
<default value="0"/>
<test logic="OR" value="1">
/ECAM/warnings/altitude-alert/big-3-all-off eq 1
/ECAM/warnings/altitude-alert/flipflop-2-reset eq 1
</test>
</switch>
<switch name="/ECAM/warnings/altitude-alert/flipflop-2-set">
<default value="0"/>
<test logic="AND" value="1">
/ECAM/warnings/altitude-alert/big-3-2-off eq 1
</test>
</switch>
<switch name="/ECAM/warnings/altitude-alert/flipflop-2-reset">
<default value="0"/>
<test logic="OR" value="1">
<test logic="AND">
/ECAM/warnings/altitude-alert/gear-downlocked-set eq 1
/ECAM/warnings/altitude-alert/gear-downlocked-output eq 1
</test>
/ECAM/warnings/altitude-alert/alt-is-changing eq 1
</test>
</switch>
<switch name="/ECAM/warnings/altitude-alert/flipflop-or-1">
<default value="0"/>
<test logic="AND" value="1">
/ECAM/warnings/altitude-alert/big-3-2-off eq 1
/ECAM/warnings/altitude-alert/flipflop-1 eq 1
</test>
</switch>
<switch name="/ECAM/warnings/altitude-alert/flipflop-or-2">
<default value="0"/>
<test logic="AND" value="1">
/ECAM/warnings/altitude-alert/big-3-all-off eq 1
/ECAM/warnings/altitude-alert/flipflop-2 eq 1
</test>
</switch>
<switch name="/ECAM/warnings/altitude-alert/flipflop-or">
<default value="0"/>
<test logic="OR" value="1">
/ECAM/warnings/altitude-alert/flipflop-or-1 eq 1
/ECAM/warnings/altitude-alert/flipflop-or-2 eq 1
</test>
</switch>
<switch name="/ECAM/warnings/altitude-alert/monostable-autopilot">
<default value="0"/>
<test logic="AND" value="1">
/it-autoflight/output/ap1 eq 0
/it-autoflight/output/ap2 eq 0
/ECAM/warnings/altitude-alert/big-3-2-off eq 1
</test>
</switch>
<switch name="/ECAM/warnings/altitude-alert/c-chord">
<default value="0"/>
<test logic="AND" value="1">
/ECAM/timer/ground-calc ne 1
<test logic="OR">
<test logic="AND">
/ECAM/warnings/altitude-alert/monostable-autopilot eq 1
/ECAM/warnings/altitude-alert/monostable-autopilot-output eq 1
</test>
/ECAM/warnings/altitude-alert/flipflop-or eq 1
</test>
</test>
</switch>
<switch name="/ECAM/warnings/altitude-alert/altitude-alert-steady">
<default value="0"/>
<test logic="AND" value="1">
/ECAM/timer/ground-calc ne 1
/ECAM/warnings/altitude-alert/big-3-2-off eq 1
/ECAM/warnings/altitude-alert/flipflop-or-1 eq 0
</test>
</switch>
<switch name="/ECAM/warnings/altitude-alert/altitude-alert-flash">
<default value="0"/>
<test logic="AND" value="1">
/ECAM/timer/ground-calc ne 1
/ECAM/warnings/altitude-alert/flipflop-or eq 1
</test>
</switch>
</channel>
</system>

View file

@ -203,6 +203,17 @@
<output>ECAM/phases/monostable/gnd-output</output>
</flipflop>
<flipflop>
<type>monostable</type>
<time>
<value>2.5</value>
</time>
<S>
<property>/ECAM/ground-calc-immediate</property>
</S>
<output>ECAM/phases/monostable/gnd-output-2</output>
</flipflop>
<flipflop>
<type>monostable</type>
<time>
@ -239,44 +250,6 @@
<output>ECAM/buttons/recall-status-normal-output</output>
</flipflop>
<flipflop>
<type>SR</type>
<S>
<property>ECAM/altitude-alert-monostable-set</property>
</S>
<R>
<property>ECAM/altitude-alert-monostable-intermediate-output</property>
</R>
<output>ECAM/altitude-alert-monostable-flipflop-intermediate</output>
</flipflop>
<flipflop>
<type>monostable</type>
<inverted type="bool">true</inverted>
<time>
<value>1.5</value>
</time>
<S>
<not><property>ECAM/altitude-alert-monostable-flipflop-intermediate</property></not>
</S>
<output>ECAM/altitude-alert-monostable-intermediate-output</output>
</flipflop>
<filter>
<type>gain</type>
<gain>1.0</gain>
<input>
<condition>
<and>
<property>ECAM/altitude-alert-monostable-flipflop-intermediate</property>
<not><property>ECAM/altitude-alert-monostable-intermediate-output</property></not>
</and>
</condition>
<value>1</value>
</input>
<output>ECAM/altitude-alert-monostable-output</output>
</filter>
<filter>
<type>derivative</type>
<input>it-autoflight/input/alt</input>
@ -292,10 +265,12 @@
<S>
<property>it-autoflight/input/alt-is-changing</property>
</S>
<output>ECAM/alt-is-changing</output>
<output>ECAM/warnings/altitude-alert/alt-is-changing</output>
</flipflop>
<filter>
<type>gain</type>
<gain>1</gain>
<input>
<condition>
<equals>
@ -314,7 +289,7 @@
</condition>
<value>0</value>
</input>
<output>ECAM/gear-downlocked-set</output>
<output>ECAM/warnings/altitude-alert/gear-downlocked-set</output>
</filter>
<flipflop>
@ -323,67 +298,9 @@
<value>1</value>
</time>
<S>
<property>ECAM/gear-downlocked-set</property>
<not><property>ECAM/warnings/altitude-alert/gear-downlocked-set</property></not>
</S>
<output>ECAM/gear-downlocked-output</output>
</flipflop>
<filter>
<type>gain</type>
<gain>1.0</gain>
<input>
<condition>
<or>
<equals><property>ECAM/gear-downlocked-output</property><value>1</value></equals>
<equals><property>ECAM/alt-is-changing</property><value>1</value></equals>
</or>
</condition>
<value>1</value>
</input>
<input>
<condition>
<and>
<equals><property>ECAM/gear-downlocked-output</property><value>0</value></equals>
<equals><property>ECAM/alt-is-changing</property><value>0</value></equals>
</and>
</condition>
<value>0</value>
</input>
<output>ECAM/flipflop/alt-alert-rs-reset</output>
</filter>
<flipflop>
<type>RS</type>
<S>
<property>ECAM/flipflop/altitude-alert-rs-set</property>
</S>
<R>
<property>ECAM/flipflop/alt-alert-rs-reset</property>
</R>
<output>ECAM/flipflop/alt-alert-rs-output</output>
</flipflop>
<flipflop>
<type>RS</type>
<S>
<property>ECAM/flipflop/alt-alert-2-rs-set</property>
</S>
<R>
<property>ECAM/flipflop/alt-alert-2-rs-reset</property>
</R>
<output>ECAM/flipflop/alt-alert-2-rs-output</output>
</flipflop>
<flipflop>
<type>RS</type>
<S>
<property>ECAM/flipflop/alt-alert-3-rs-set</property>
</S>
<R>
<property>ECAM/flipflop/alt-alert-rs-reset</property>
</R>
<output>ECAM/flipflop/alt-alert-3-rs-output</output>
<output>ECAM/warnings/altitude-alert/gear-downlocked-output</output>
</flipflop>
<!-- falling edge detector - take inverse of following -->
@ -466,7 +383,7 @@
<value>1.0</value>
</time>
<S>
<property>ECAM/phases/to-power-set</property>
<property>ECAM/phases/phase-calculation/takeoff-power</property>
</S>
<output>ECAM/phases/monostable/to-power-set-output</output>
</flipflop>
@ -1069,4 +986,47 @@
<output>/ECAM/warnings/logic/green-yellow-press-on-monostable</output>
</flipflop>
<flipflop>
<type>RS</type>
<S>
<property>/ECAM/warnings/altitude-alert/flipflop-1-set</property>
</S>
<R>
<property>/ECAM/warnings/altitude-alert/flipflop-1-reset</property>
</R>
<output>/ECAM/warnings/altitude-alert/flipflop-1</output>
</flipflop>
<flipflop>
<type>RS</type>
<S>
<property>/ECAM/warnings/altitude-alert/flipflop-2-set</property>
</S>
<R>
<property>/ECAM/warnings/altitude-alert/flipflop-2-reset</property>
</R>
<output>/ECAM/warnings/altitude-alert/flipflop-2</output>
</flipflop>
<flipflop>
<type>monostable</type>
<time>
<value>1.5</value>
</time>
<S>
<not><property>/ECAM/warnings/altitude-alert/monostable-autopilot</property></not>
</S>
<output>/ECAM/warnings/altitude-alert/monostable-autopilot-output</output>
</flipflop>
<flipflop>
<type>RS</type>
<S>
<property>/ECAM/phases/phase-calculation/altitude-flipflop-set</property>
</S>
<R>
<property>/ECAM/phases/phase-calculation/altitude-flipflop-reset</property>
</R>
<output>/ECAM/phases/phase-calculation/altitude-ge-800</output>
</flipflop>
</PropertyList>