1
0
Fork 0

Merge branch 'dev' into alignND

This commit is contained in:
legoboyvdlp R 2020-11-02 23:51:40 +00:00
commit fcc6331556
47 changed files with 5356 additions and 3749 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>
@ -138,6 +177,8 @@
<model type="int">4</model>
</rating>
<status>Pre V1.0</status>
<tags>
<tag>transport</tag>
<tag>airbus</tag>
@ -153,6 +194,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>
@ -512,8 +560,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">
@ -543,6 +616,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>
@ -846,6 +952,7 @@
<du4 type="double">1</du4>
<du5 type="double">1</du5>
<du6 type="double">1</du6>
<iesi type="double">1</iesi>
<mcdu1 type="double">1</mcdu1>
<mcdu2 type="double">1</mcdu2>
</DU>
@ -1085,6 +1192,10 @@
<transponder-code type="string">2000</transponder-code>
<failed type="bool">0</failed>
</atc>
<atsu>
<atis-server type="string">faa</atis-server>
<wxr-server type="string">faa</wxr-server>
</atsu>
<apu>
<oil>
<level-l type="double">5.4</level-l>
@ -1109,6 +1220,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>
@ -1381,6 +1493,7 @@
</pneumatics>
<pressurization>
<cabinalt-norm type="double">0</cabinalt-norm>
<cabinpsi type="double">14.7</cabinpsi>
<ditchingpb type="double">14.7</ditchingpb>
</pressurization>
@ -1573,6 +1686,10 @@
<range type="double">1.0</range>
</groundradar>
<iesi>
<att-reset-cmd type="bool">false</att-reset-cmd>
</iesi>
<marker-beacon n="0">
<serviceable type="bool">true</serviceable>
</marker-beacon>
@ -1722,6 +1839,10 @@
<max-range-m type="int">1219</max-range-m>
<serviceable type="bool">true</serviceable>
</radar-altimeter>
<wxr>
<enabled type="bool">false</enabled>
</wxr>
</instrumentation>
<modes>
@ -4254,6 +4375,9 @@
</aircraft>
<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>
@ -4316,21 +4440,22 @@
</fmgc>
<mcdu>
<file>Aircraft/A320-family/Nasal/MCDU/DUPLICATE.nas</file> <!-- dynamic page - init before others as used in various pages -->
<file>Aircraft/A320-family/Nasal/MCDU/DIRTO.nas</file> <!-- dynamic page - init before MCDU -->
<file>Aircraft/A320-family/Nasal/MCDU/LATREV.nas</file> <!-- dynamic page - init before MCDU -->
<file>Aircraft/A320-family/Nasal/MCDU/VERTREV.nas</file> <!-- dynamic page - init before MCDU -->
<file>Aircraft/A320-family/Nasal/MCDU/DEPARTURE.nas</file> <!-- dynamic page - init before MCDU -->
<file>Aircraft/A320-family/Nasal/MCDU/ARRIVAL.nas</file> <!-- dynamic page - init before MCDU -->
<file>Aircraft/A320-family/Nasal/MCDU/AIRWAYS.nas</file> <!-- dynamic page - init before MCDU -->
<file>Aircraft/A320-family/Nasal/MCDU/CLOSESTAIRPORT.nas</file> <!-- dynamic page - init before MCDU -->
<file>Aircraft/A320-family/Nasal/MCDU/RECEIVEDMESSAGES.nas</file> <!-- dynamic page - init before MCDU -->
<file>Aircraft/A320-family/Nasal/MCDU/PILOTWAYPOINT.nas</file> <!-- dynamic page - init before MCDU -->
<file>Aircraft/A320-family/Nasal/MCDU/HOLD.nas</file> <!-- dynamic page - init before MCDU -->
<file>Aircraft/A320-family/Nasal/MCDU/F-PLN.nas</file> <!-- dynamic page - init before MCDU -->
<file>Aircraft/A320-family/Nasal/MCDU/WINDCLB.nas</file> <!-- dynamic page - init before MCDU -->
<file>Aircraft/A320-family/Nasal/MCDU/WINDCRZ.nas</file> <!-- dynamic page - init before MCDU -->
<file>Aircraft/A320-family/Nasal/MCDU/WINDDES.nas</file> <!-- dynamic page - init before MCDU -->
<file>Aircraft/A320-family/Nasal/MCDU/WINDHIST.nas</file> <!-- dynamic page - init before MCDU -->
<file>Aircraft/A320-family/Nasal/MCDU/DIRTO.nas</file>
<file>Aircraft/A320-family/Nasal/MCDU/LATREV.nas</file>
<file>Aircraft/A320-family/Nasal/MCDU/VERTREV.nas</file>
<file>Aircraft/A320-family/Nasal/MCDU/DEPARTURE.nas</file>
<file>Aircraft/A320-family/Nasal/MCDU/ARRIVAL.nas</file>
<file>Aircraft/A320-family/Nasal/MCDU/AIRWAYS.nas</file>
<file>Aircraft/A320-family/Nasal/MCDU/CLOSESTAIRPORT.nas</file>
<file>Aircraft/A320-family/Nasal/MCDU/RECEIVEDMESSAGES.nas</file>
<file>Aircraft/A320-family/Nasal/MCDU/PILOTWAYPOINT.nas</file>
<file>Aircraft/A320-family/Nasal/MCDU/HOLD.nas</file>
<file>Aircraft/A320-family/Nasal/MCDU/F-PLN.nas</file>
<file>Aircraft/A320-family/Nasal/MCDU/WINDCLB.nas</file>
<file>Aircraft/A320-family/Nasal/MCDU/WINDCRZ.nas</file>
<file>Aircraft/A320-family/Nasal/MCDU/WINDDES.nas</file>
<file>Aircraft/A320-family/Nasal/MCDU/WINDHIST.nas</file>
<file>Aircraft/A320-family/Nasal/MCDU/ATIS.nas</file> <!-- Last Dynamic Page -->
<file>Aircraft/A320-family/Nasal/MCDU/MCDU.nas</file>
<file>Aircraft/A320-family/Nasal/MCDU/INITA.nas</file>
<file>Aircraft/A320-family/Nasal/MCDU/IRSINIT.nas</file>
@ -4360,6 +4485,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>
@ -4399,6 +4525,7 @@
<file>Aircraft/A320-family/Nasal/Panels/atc.nas</file>
</atc>
<atsu>
<file>Aircraft/A320-family/Nasal/Systems/Comm/Dictionary.nas</file>
<file>Aircraft/A320-family/Nasal/Systems/Comm/Notification.nas</file>
</atsu>
<dmc>

View file

@ -76,6 +76,8 @@ setprop("/systems/acconfig/options/keyboard-mode", 0);
setprop("/systems/acconfig/options/weight-kgs", 0);
setprop("/systems/acconfig/options/adirs-skip", 0);
setprop("/systems/acconfig/options/allow-oil-consumption", 0);
setprop("/systems/acconfig/options/atis-server", "faa");
setprop("/systems/acconfig/options/wxr-server", "noaa");
setprop("/systems/acconfig/options/welcome-skip", 0);
setprop("/systems/acconfig/options/no-rendering-warn", 0);
setprop("/systems/acconfig/options/save-state", 0);
@ -231,6 +233,8 @@ var readSettings = func {
setprop("/sim/model/autopush/route/show-wingtip", getprop("/systems/acconfig/options/autopush/show-wingtip"));
setprop("/options/system/fo-view", getprop("/systems/acconfig/options/fo-view"));
setprop("/FMGC/simbrief-username", getprop("/systems/acconfig/options/simbrief-username"));
setprop("/systems/atsu/atis-server", getprop("/systems/acconfig/options/atis-server"));
setprop("/systems/atsu/wxr-server", getprop("/systems/acconfig/options/wxr-server"));
}
var writeSettings = func {
@ -243,6 +247,8 @@ var writeSettings = func {
setprop("/systems/acconfig/options/autopush/show-wingtip", getprop("/sim/model/autopush/route/show-wingtip"));
setprop("/systems/acconfig/options/fo-view", getprop("/options/system/fo-view"));
setprop("/systems/acconfig/options/simbrief-username", getprop("/FMGC/simbrief-username"));
setprop("/systems/acconfig/options/atis-server", getprop("/systems/atsu/atis-server"));
setprop("/systems/acconfig/options/wxr-server", getprop("/systems/atsu/wxr-server"));
io.write_properties(getprop("/sim/fg-home") ~ "/Export/A320-family-config.xml", "/systems/acconfig/options");
}

View file

@ -7251,6 +7251,128 @@
<object-name>iesi_btn_rst</object-name>
</effect>
<animation>
<type>pick</type>
<object-name>iesi_btn_rst</object-name>
<action>
<button>0</button>
<repeatable>false</repeatable>
<binding>
<command>property-assign</command>
<property>/instrumentation/iesi/att-reset-cmd</property>
<value>1</value>
</binding>
<mod-up>
<binding>
<command>property-assign</command>
<property>/instrumentation/iesi/att-reset-cmd</property>
<value>0</value>
</binding>
</mod-up>
</action>
</animation>
<animation>
<type>translate</type>
<object-name>iesi_btn_rst</object-name>
<property>/instrumentation/iesi/att-reset-cmd</property>
<factor>0.0025</factor>
<axis>
<x1-m>-0.53312</x1-m>
<y1-m>-0.16166</y1-m>
<z1-m>0.16956</z1-m>
<x2-m>-0.53977</x2-m>
<y2-m>-0.16166</y2-m>
<z2-m>0.16765</z2-m>
</axis>
</animation>
<animation>
<type>pick</type>
<object-name>iesi_btn_plus</object-name>
<action>
<button>0</button>
<repeatable>true</repeatable>
<binding>
<command>property-assign</command>
<property>/instrumentation/iesi/plus</property>
<value>1</value>
</binding>
<binding>
<command>property-adjust</command>
<property>controls/lighting/DU/iesi</property>
<step>0.05</step>
<min>0</min>
<max>1</max>
</binding>
<mod-up>
<binding>
<command>property-assign</command>
<property>/instrumentation/iesi/plus</property>
<value>0</value>
</binding>
</mod-up>
</action>
</animation>
<animation>
<type>translate</type>
<object-name>iesi_btn_plus</object-name>
<property>/instrumentation/iesi/plus</property>
<factor>0.0025</factor>
<axis>
<x1-m>-0.53312</x1-m>
<y1-m>-0.16166</y1-m>
<z1-m>0.16956</z1-m>
<x2-m>-0.53977</x2-m>
<y2-m>-0.16166</y2-m>
<z2-m>0.16765</z2-m>
</axis>
</animation>
<animation>
<type>pick</type>
<object-name>iesi_btn_minus</object-name>
<action>
<button>0</button>
<repeatable>true</repeatable>
<binding>
<command>property-assign</command>
<property>/instrumentation/iesi/minus</property>
<value>1</value>
</binding>
<binding>
<command>property-adjust</command>
<property>controls/lighting/DU/iesi</property>
<step>-0.05</step>
<min>0</min>
<max>1</max>
</binding>
<mod-up>
<binding>
<command>property-assign</command>
<property>/instrumentation/iesi/minus</property>
<value>0</value>
</binding>
</mod-up>
</action>
</animation>
<animation>
<type>translate</type>
<object-name>iesi_btn_minus</object-name>
<property>/instrumentation/iesi/minus</property>
<factor>0.0025</factor>
<axis>
<x1-m>-0.53312</x1-m>
<y1-m>-0.16166</y1-m>
<z1-m>0.16956</z1-m>
<x2-m>-0.53977</x2-m>
<y2-m>-0.16166</y2-m>
<z2-m>0.16765</z2-m>
</axis>
</animation>
<effect>
<inherits-from>Aircraft/A320-family/Models/Effects/clock</inherits-from>
<!-- <object-name>clock</object-name>-->
@ -8459,4 +8581,48 @@
</action>
</animation>
<!-- WX Radar -->
<animation>
<type>pick</type>
<object-name>radar_sys</object-name>
<action>
<button>0</button>
<repeatable>false</repeatable>
<binding>
<command>property-toggle</command>
<property>/instrumentation/efis[0]/inputs/wxr</property>
</binding>
<binding>
<command>property-toggle</command>
<property>/instrumentation/efis[1]/inputs/wxr</property>
</binding>
<binding>
<command>property-toggle</command>
<property>/instrumentation/wxr/enabled</property>
</binding>
<binding>
<command>nasal</command>
<script>setprop("sim/sounde/switch1", 1);</script>
</binding>
</action>
</animation>
<animation>
<type>rotate</type>
<object-name>radar_sys</object-name>
<factor>-20</factor>
<property>/instrumentation/wxr/enabled</property>
<center>
<x-m>0.020282</x-m>
<y-m>-0.210647</y-m>
<z-m>-0.140496</z-m>
</center>
<axis>
<x>1</x>
<y>0</y>
<z>0</z>
</axis>
</animation>
</PropertyList>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 520 KiB

After

Width:  |  Height:  |  Size: 534 KiB

View file

@ -13,16 +13,16 @@ var mach_act = 0;
# props.nas nodes
var iesi_init = props.globals.initNode("/instrumentation/iesi/iesi-init", 0, "BOOL");
var iesi_time = props.globals.initNode("/instrumentation/iesi/iesi-init-time", 0.0, "DOUBLE");
var iesi_reset = props.globals.initNode("/instrumentation/iesi/att-reset", 0, "DOUBLE");
var iesi_brt = props.globals.getNode("/controls/lighting/DU/iesi", 1);
var iesi_rate = props.globals.getNode("/systems/acconfig/options/iesi-rate", 1);
var et = props.globals.getNode("/sim/time/elapsed-sec", 1);
var aconfig = props.globals.getNode("/systems/acconfig/autoconfig-running", 1);
var airspeed = props.globals.getNode("/instrumentation/airspeed-indicator/indicated-speed-kt", 1);
var mach = props.globals.getNode("/instrumentation/airspeed-indicator/indicated-mach", 1);
var pitch = props.globals.getNode("/orientation/pitch-deg", 1);
var roll = props.globals.getNode("/orientation/roll-deg", 1);
var skid = props.globals.getNode("/instrumentation/slip-skid-ball/indicated-slip-skid", 1);
var pitch = props.globals.getNode("/instrumentation/iesi/pitch-deg", 1);
var skid = props.globals.getNode("/instrumentation/iesi/slip-skid", 1);
var altitude = props.globals.getNode("/instrumentation/altimeter/indicated-altitude-ft", 1);
var altitude_ind = props.globals.getNode("/instrumentation/altimeter/indicated-altitude-ft-pfd", 1);
@ -30,6 +30,10 @@ 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 = {
init: func(canvas_group, file) {
var font_mapper = func(family, weight) {
@ -66,6 +70,10 @@ var canvas_IESI_base = {
me.AI_horizon_trans = me["AI_horizon"].createTransform();
me.AI_horizon_rot = me["AI_horizon"].createTransform();
_showIESI = 0;
_fast = 0;
_IESITime = 0.0;
me.page = canvas_group;
return me;
@ -75,19 +83,42 @@ var canvas_IESI_base = {
},
update: func() {
cur_time = et.getValue();
# todo consider relay 7XB for power of DC HOT 1
# todo transient max 0.2s
# todo 20W power consumption
if (iesi_reset.getValue() == 1) {
if (iesi_init.getBoolValue() and _IESITime + 90 >= et.getValue()) {
_fast = 1;
} else {
_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)) {
IESI.page.show();
_showIESI = 1;
IESI.update();
if (aconfig.getValue() != 1 and iesi_init.getValue() != 1) {
iesi_init.setBoolValue(1);
iesi_time.setValue(cur_time);
if (_fast) {
_IESITime = cur_time - 80;
_fast = 0;
} else {
_IESITime = cur_time;
}
} else if (aconfig.getValue() == 1 and iesi_init.getValue() != 1) {
iesi_init.setBoolValue(1);
iesi_time.setValue(cur_time - 87);
_IESITime = cur_time - 87;
}
} else {
_showIESI = 0;
iesi_init.setBoolValue(0);
}
if (_showIESI and iesi_brt.getValue() > 0.01) {
IESI.page.show();
} else {
IESI.page.hide();
}
},
@ -98,14 +129,20 @@ var canvas_IESI = {
var m = {parents: [canvas_IESI, canvas_IESI_base]};
m.init(canvas_group, file);
m._cachedInhg = -99;
m._machWasAbove50 = 0;
m._roll = 0;
return m;
},
getKeys: func() {
return ["IESI","IESI_Init","ASI_scale","ASI_mach","ASI_mach_decimal","AI_center","AI_horizon","AI_bank","AI_slipskid","ALT_scale","ALT_one","ALT_two","ALT_three","ALT_four","ALT_five","ALT_digits","ALT_tens","ALT_meters","QNH_setting","QNH_std"];
return ["IESI","IESI_Init","ASI_scale","ASI_mach","ASI_mach_decimal","AI_center","AI_horizon","AI_bank","AI_slipskid","ALT_scale","ALT_one","ALT_two","ALT_three","ALT_four","ALT_five","ALT_digits","ALT_tens","ALT_meters","QNH_setting","QNH_std","negText","negText2","AI_bank_scale"];
},
update: func() {
if (iesi_time.getValue() + 90 >= et.getValue()) {
if (qnh_inhg.getValue() != me._cachedInhg) {
me._cachedInhg = qnh_inhg.getValue();
me.updateQNH();
}
if (_IESITime + 90 >= et.getValue()) {
me["IESI"].hide();
me["IESI_Init"].show();
return;
@ -115,22 +152,27 @@ var canvas_IESI = {
}
# Airspeed
# Subtract 30, since the scale starts at 30, but don"t allow less than 0, or more than 420 situations
# Subtract 30, since the scale starts at 30, but don't allow less than 0, or more than 520 knots
airspeed_act = airspeed.getValue();
mach_act = mach.getValue();
if (airspeed_act <= 30) {
ASI = 0;
} else if (airspeed_act >= 420) {
ASI = 390;
} else if (airspeed_act >= 520) {
ASI = 490;
} else {
ASI = airspeed_act - 30;
}
me["ASI_scale"].setTranslation(0, ASI * 8.295);
if (mach_act >= 0.5) {
me._machWasAbove50 = 1;
me["ASI_mach_decimal"].show();
me["ASI_mach"].show();
} elsif (mach_act >= 0.45 and me._machWasAbove50) {
me["ASI_mach_decimal"].show();
me["ASI_mach"].show();
} else {
me._machWasAbove50 = 0;
me["ASI_mach_decimal"].hide();
me["ASI_mach"].hide();
}
@ -142,14 +184,29 @@ var canvas_IESI = {
}
# Attitude
me._roll = pts.Orientation.roll.getValue();
me.AI_horizon_trans.setTranslation(0, pitch.getValue() * 16.74);
me.AI_horizon_rot.setRotation(-roll.getValue() * D2R, me["AI_center"].getCenter());
me.AI_horizon_rot.setRotation(-me._roll * D2R, me["AI_center"].getCenter());
me["AI_slipskid"].setTranslation(math.clamp(skid.getValue(), -7, 7) * -15, 0);
me["AI_bank"].setRotation(-roll.getValue() * D2R);
me["AI_slipskid"].setTranslation(skid.getValue(), 0);
me["AI_bank"].setRotation(-me._roll * D2R);
# Altitude
me.altitude = altitude.getValue();
if (me.altitude > 50000) {
me.altitude = 50000;
} elsif (me.altitude < -2000) {
me.altitude = -2000;
}
if (me.altitude < 0) {
me["negText"].show();
me["negText2"].show();
} else {
me["negText"].hide();
me["negText2"].hide();
}
me.altOffset = me.altitude / 500 - int(me.altitude / 500);
me.middleAltText = roundaboutAlt(me.altitude / 100);
me.middleAltOffset = nil;
@ -166,15 +223,17 @@ var canvas_IESI = {
me["ALT_two"].setText(sprintf("%03d", abs(me.middleAltText-5)));
me["ALT_one"].setText(sprintf("%03d", abs(me.middleAltText-10)));
me["ALT_digits"].setText(sprintf("%s", altitude_ind.getValue()));
me["ALT_meters"].setText(sprintf("%5.0f", me.altitude * 0.3048));
altTens = num(right(sprintf("%02d", altitude.getValue()), 2));
me["ALT_tens"].setTranslation(0, altTens * 3.16);
if (qnh_inhg.getValue() != me._cachedInhg) {
me._cachedInhg = qnh_inhg.getValue();
me.updateQNH();
me.altitudeText = altitude_ind.getValue();
if (me.altitude < 0 and me.altitudeText > 20) {
me.altitudeText = 20;
} elsif (me.altitude > 0 and me.altitudeText > 500) {
me.altitudeText = 500;
}
me["ALT_digits"].setText(sprintf("%s", me.altitudeText));
me["ALT_meters"].setText(sprintf("%5.0f", math.round(me.altitude * 0.3048, 10)));
altTens = num(right(sprintf("%02d", me.altitude), 2));
me["ALT_tens"].setTranslation(0, altTens * 3.16);
},
updateQNH: func() {
if (altimeter_mode.getBoolValue()) {

View file

@ -19,15 +19,15 @@
</action>
</animation>
<!--animation>
<animation>
<type>material</type>
<object-name>pfd1.screen</object-name>
<object-name>iesi.screen</object-name>
<emission>
<red>1</red>
<green>1</green>
<blue>1</blue>
<factor-prop>controls/lighting/DU/iesi</factor-prop>
</emission>
</animation-->
</animation>
</PropertyList>

File diff suppressed because it is too large Load diff

Before

Width:  |  Height:  |  Size: 121 KiB

After

Width:  |  Height:  |  Size: 115 KiB

View file

@ -25,6 +25,7 @@ var myCLBWIND = [nil, nil];
var myCRZWIND = [nil, nil];
var myDESWIND = [nil, nil];
var myHISTWIND = [nil, nil];
var myAtis = [nil, nil];
var default = "BoeingCDU-Large.ttf";
#var symbol = "helvetica_medium.txf";
var symbol = "LiberationMonoCustom.ttf";
@ -231,7 +232,8 @@ var canvas_MCDU_base = {
"PERFAPPR_FE","PERFAPPR_SE","PERFAPPR_OE","PERFAPPR_LDG_3","PERFAPPR_LDG_F","PERFGA","PERFGA_FE","PERFGA_SE","PERFGA_OE","FPLN","FPLN_From",
"FPLN_TMPY_group","FPLN_FROM","FPLN_Callsign","departureTMPY", "arrowsDepArr","arrow1L","arrow2L","arrow3L","arrow4L","arrow5L","arrow1R","arrow2R",
"arrow3R","arrow4R","arrow5R","DIRTO_TMPY_group","IRSINIT","IRSINIT_1","IRSINIT_2","IRSINIT_star","NOTIFY","NOTIFY_FLTNBR","NOTIFY_AIRPORT","WEATHERREQSEND",
"WIND","WIND_CANCEL","WIND_INSERT_star","WIND_UPDOWN","MODEVHF3","PRINTPAGE","COMM-ADS","COCALL","COCALLTUNE"];
"WIND","WIND_CANCEL","WIND_INSERT_star","WIND_UPDOWN","MODEVHF3","PRINTPAGE","COMM-ADS","COCALL","COCALLTUNE","ATISSend1","ATISSend2","ATISSend3","ATISSend4",
"ATISArrows"];
},
update: func() {
if (systems.ELEC.Bus.ac1.getValue() >= 110 and mcdu1_lgt.getValue() > 0.01) {
@ -362,6 +364,15 @@ var canvas_MCDU_base = {
me["PRINTPAGE"].setColor(WHITE);
}
}
if (page != "ATIS") {
me["ATISSend1"].hide();
me["ATISSend2"].hide();
me["ATISSend3"].hide();
me["ATISSend4"].hide();
}
if (page != "ATISDETAIL") {
me["ATISArrows"].hide();
}
if (page == "F-PLNA" or page == "F-PLNB") {
if (!pageSwitch[i].getBoolValue()) {
me["Simple"].show();
@ -545,12 +556,14 @@ var canvas_MCDU_base = {
me.showLeftArrow(1, 1, 1, -1, 1, 1);
me.showRight(1, 1, 1, 1, 1, -1);
me.showRightS(-1, -1, -1, -1, -1, -1);
me.showRightArrow(1, 1, 1, 1, 1, -1);
me.showRightArrow(1, 1, 1, 1, 1, 1);
me["Simple_C3B"].hide();
me["Simple_C4B"].hide();
me.standardFontSize();
me.standardFontColour();
me["Simple_R6"].setColor(BLUE);
me["Simple_R6_Arrow"].setColor(BLUE);
me["Simple_L1"].setText(" PREFLIGHT");
me["Simple_L2"].setText(" ENROUTE");
@ -564,8 +577,72 @@ var canvas_MCDU_base = {
me["Simple_R3"].setText("RCVD MSGS ");
me["Simple_R4"].setText("REPORTS ");
me["Simple_R5"].setText("CONFIG ");
me["Simple_R6"].setText("MESSAGE ");
pageSwitch[i].setBoolValue(1);
}
if (mcdu.ReceivedMessagesDatabase.firstUnviewed() != -99) {
me["Simple_R6"].show();
me["Simple_R6_Arrow"].show();
} else {
me["Simple_R6"].hide();
me["Simple_R6_Arrow"].hide();
}
} else if (page == "AOCCONFIG") {
if (!pageSwitch[i].getBoolValue()) {
me.defaultHideWithCenter();
me["Simple_Title"].setText("AOC CONFIGURATION");
me.defaultPageNumbers();
me.showLeft(1, -1, -1, -1, -1, 1);
me["Simple_L0S"].hide();
me.showLeftS(1, -1, -1, -1, -1, 1);
me.showLeftArrow(-1, -1, -1, -1, -1, 1);
me.showCenter(1, 1, 1, 1, 1, -1);
me.showCenterS(1, -1, 1, -1, 1, -1);
me.showRight(1, -1, -1, -1, -1, 1);
me.showRightS(1, -1, -1, -1, -1, -1);
me.showRightArrow(-1, -1, -1, -1, -1, -1);
me["Simple_C3B"].hide();
me["Simple_C4B"].hide();
me.standardFontSize();
me.standardFontColour();
me["Simple_L1S"].setText("A/C REG");
me["Simple_L1"].setFontSize(small);
me["Simple_L1"].setColor(GREEN);
me["Simple_C1S"].setColor(GREEN);
me["Simple_R1"].setFontSize(small);
me["Simple_R1"].setColor(GREEN);
me["Simple_R1S"].setText("TYPE");
me["Simple_L6S"].setText(" RETURN TO");
me["Simple_L6"].setText(" AOC MENU");
me["Simple_C2"].setText("ATSU SW AND DB PN");
me["Simple_C3S"].setText("998.2459.501");
me["Simple_C3S"].setFontSize(small);
me["Simple_C3S"].setColor(GREEN);
me["Simple_C3"].setText("998.2460.501");
me["Simple_C3"].setFontSize(small);
me["Simple_C3"].setColor(GREEN);
me["Simple_C4"].setText("ATSU AOC ID");
me["Simple_C5S"].setText("AS2TOC1015010F1");
me["Simple_C5S"].setFontSize(small);
me["Simple_C5S"].setColor(GREEN);
me["Simple_C5"].setText("AS2TOC1012001F2");
me["Simple_C5"].setFontSize(small);
me["Simple_C5"].setColor(GREEN);
me["Simple_R6"].setText("PRINT ");
me["Simple_R6"].setColor(BLUE);
me["Simple_C1"].setFontSize(small);
me["Simple_C1"].setColor(GREEN);
pageSwitch[i].setBoolValue(1);
}
me["Simple_L1"].setText(getprop("/options/model-options/registration"));
me["Simple_C1S"].setText(sprintf("%02.0f", getprop("/sim/time/utc/hour")) ~ sprintf("%02.0f", getprop("/sim/time/utc/minute")));
me["Simple_C1"].setText(sprintf("%02.0f", getprop("/sim/time/utc/day")) ~ "/" ~ sprintf("%02.0f", getprop("/sim/time/utc/month")) ~ "/" ~ right(sprintf(getprop("/sim/time/utc/year")), 2));
me["Simple_R1S"].setText("TYPE");
me["Simple_R1"].setText(getprop("/MCDUC/type"));
} else if (page == "WEATHERREQ") {
if (!pageSwitch[i].getBoolValue()) {
me.defaultHide();
@ -913,6 +990,217 @@ var canvas_MCDU_base = {
me["Simple_R1"].setText("ATIS ");
pageSwitch[i].setBoolValue(1);
}
} else if (page == "ATISDETAIL") {
if (!pageSwitch[i].getBoolValue()) {
me.defaultHide();
me["Simple_PageNum"].hide();
me["ArrowLeft"].hide();
me["ArrowRight"].hide();
me["Simple_L0S"].hide();
me["Simple_C3B"].hide();
me["Simple_C4B"].hide();
me.fontLeft(default, default, default, default, default, default);
me.fontLeftS(default, default, default, default, default, default);
me.fontRight(default, default, default, default, default, default);
me.fontRightS(default, default, default, default, default, default);
me.fontSizeLeft(small, small, small, small, normal, normal);
me.fontSizeCenter(normal, normal, normal, normal, normal, normal);
me.fontSizeRight(normal, normal, normal, normal, normal, normal);
me.colorLeftS("grn", "wht", "wht", "wht", "wht", "wht");
me.colorRightS("grn", "wht", "wht", "wht", "wht", "wht");
if (myAtis[i] != nil) {
me["Simple_Title"].setText(sprintf("%s", myAtis[i].title));
me.dynamicPageArrowFunc(myAtis[i]);
me.colorLeftArrow(myAtis[i].arrowsColour[0][0],myAtis[i].arrowsColour[0][1],myAtis[i].arrowsColour[0][2],myAtis[i].arrowsColour[0][3],myAtis[i].arrowsColour[0][4],myAtis[i].arrowsColour[0][5]);
me.colorRightArrow(myAtis[i].arrowsColour[1][0],myAtis[i].arrowsColour[1][1],myAtis[i].arrowsColour[1][2],myAtis[i].arrowsColour[1][3],myAtis[i].arrowsColour[1][4],myAtis[i].arrowsColour[1][5]);
me.dynamicPageFunc(myAtis[i].L1, "Simple_L1");
me.dynamicPageFunc(myAtis[i].L2, "Simple_L2");
me.dynamicPageFunc(myAtis[i].L3, "Simple_L3");
me.dynamicPageFunc(myAtis[i].L4, "Simple_L4");
me.dynamicPageFunc(myAtis[i].L5, "Simple_L5");
me.dynamicPageFunc(myAtis[i].L6, "Simple_L6");
me.colorLeft(myAtis[i].L1[2],myAtis[i].L2[2],myAtis[i].L3[2],myAtis[i].L4[2],myAtis[i].L5[2],myAtis[i].L6[2]);
me.dynamicPageFunc(myAtis[i].R1, "Simple_R1");
me.dynamicPageFunc(myAtis[i].R2, "Simple_R2");
me.dynamicPageFunc(myAtis[i].R3, "Simple_R3");
me.dynamicPageFunc(myAtis[i].R4, "Simple_R4");
me.dynamicPageFunc(myAtis[i].R5, "Simple_R5");
me.dynamicPageFunc(myAtis[i].R6, "Simple_R6");
me.colorRight(myAtis[i].R1[2],myAtis[i].R2[2],myAtis[i].R3[2],myAtis[i].R4[2],myAtis[i].R5[2],myAtis[i].R6[2]);
}
if (myAtis[i].getNumPages() > 1) {
me["Simple_PageNum"].show();
me["ATISArrows"].show();
me["Simple_PageNum"].setText(myAtis[i].page ~ "/" ~ myAtis[i].getNumPages());
} else {
me["Simple_PageNum"].hide();
me["ATISArrows"].hide();
}
pageSwitch[i].setBoolValue(1);
}
} else if (page == "ATIS") {
if (!pageSwitch[i].getBoolValue()) {
me.defaultHideWithCenter();
me["Simple_Title"].setText("ATS623 ATIS MENU");
me["Simple_Title"].setColor(1, 1, 1);
me["Simple_PageNum"].hide();
me["ArrowLeft"].hide();
me["ArrowRight"].hide();
me.showLeft(1, 1, 1, 1, -1, 1);
me["Simple_L0S"].hide();
me.showLeftS(1, -1, -1, -1, -1, 1);
me.showLeftArrow(1, 1, 1, -1, -1, 1);
me.showCenter(-1, -1, -1, -1, -1, -1);
me.showCenterS(-1, -1, -1, -1, -1, -1);
me.showRight(1, 1, 1, 1, 1, 1);
me.showRightS(1, 1, 1, 1, 1, 1);
me.showRightArrow(-1, -1, -1, -1, 1, -1);
me["Simple_C3B"].hide();
me["Simple_C4B"].hide();
me.standardFontSize();
me.colorLeft("blu", "blu", "blu", "blu", "wht", "wht");
me.colorLeftS("wht", "wht", "wht", "wht", "wht", "wht");
me.colorLeftArrow("wht", "wht", "wht", "wht", "wht", "wht");
me.colorCenter("grn", "grn", "grn", "grn", "wht", "wht");
me.colorCenterS("wht", "wht", "wht", "wht", "wht", "wht");
me.colorRight("wht", "wht", "wht", "wht", "wht", "wht");
me.colorRightS("wht", "wht", "wht", "wht", "wht", "wht");
me.colorRightArrow("wht", "wht", "wht", "wht", "wht", "wht");
me["Simple_L1S"].setText(" ARPT/TYPE");
me["Simple_L6S"].setText(" ATC MENU");
me["Simple_L4"].setText(" [ ]/[ ]");
me["Simple_L4"].setFont(symbol);
me["Simple_L6"].setText(" RETURN");
me["Simple_C1"].setFontSize(small);
me["Simple_C2"].setFontSize(small);
me["Simple_C3"].setFontSize(small);
me["Simple_C4"].setFontSize(small);
me["Simple_R1S"].setText("REQ ");
me["Simple_R1"].setText("SEND ");
me["Simple_R2S"].setText("REQ ");
me["Simple_R2"].setText("SEND ");
me["Simple_R3S"].setText("REQ ");
me["Simple_R3"].setText("SEND ");
me["Simple_R4S"].setText("REQ ");
me["Simple_R4"].setText("SEND ");
me["Simple_R5S"].setText("AUTO ");
me["Simple_R5"].setText("UPDATE ");
me["Simple_R6S"].setText("PRINT MANUAL ");
me["Simple_R6"].setText("SET AUTO ");
pageSwitch[i].setBoolValue(1);
}
if (atsu.ATISInstances[0].station != nil) {
me["Simple_L1"].setText(" " ~ atsu.ATISInstances[0].station ~ "/" ~ (atsu.ATISInstances[0].type == 0 ? "ARR" : "DEP"));
me["Simple_L1"].setFont(default);
me["Simple_L1_Arrow"].show();
} else {
me["Simple_L1"].setText(" [ ]/[ ]");
me["Simple_L1"].setFont(symbol);
me["Simple_L1_Arrow"].hide();
}
if (atsu.ATISInstances[0].received) {
me["Simple_C1"].setText(" " ~ atsu.ATISInstances[0].receivedCode ~ " " ~ atsu.ATISInstances[0].receivedTime);
me["Simple_C1"].show();
} else {
me["Simple_C1"].hide();
}
if (atsu.ATISInstances[1].station != nil) {
me["Simple_L2"].setText(" " ~ atsu.ATISInstances[1].station ~ "/" ~ (atsu.ATISInstances[1].type == 0 ? "ARR" : "DEP"));
me["Simple_L2"].setFont(default);
me["Simple_L2_Arrow"].show();
} else {
me["Simple_L2"].setText(" [ ]/[ ]");
me["Simple_L2"].setFont(symbol);
me["Simple_L2_Arrow"].hide();
}
if (atsu.ATISInstances[1].received) {
me["Simple_C2"].setText(" " ~ atsu.ATISInstances[1].receivedCode ~ " " ~ atsu.ATISInstances[1].receivedTime);
me["Simple_C2"].show();
} else {
me["Simple_C2"].hide();
}
if (atsu.ATISInstances[2].station != nil) {
me["Simple_L3"].setText(" " ~ atsu.ATISInstances[2].station ~ "/" ~ (atsu.ATISInstances[2].type == 0 ? "ARR" : "DEP"));
me["Simple_L3"].setFont(default);
me["Simple_L3_Arrow"].show();
} else {
me["Simple_L3"].setText(" [ ]/[ ]");
me["Simple_L3"].setFont(symbol);
me["Simple_L3_Arrow"].hide();
}
if (atsu.ATISInstances[2].received) {
me["Simple_C3"].setText(" " ~ atsu.ATISInstances[2].receivedCode ~ " " ~ atsu.ATISInstances[2].receivedTime);
me["Simple_C3"].show();
} else {
me["Simple_C3"].hide();
}
if (atsu.ATISInstances[3].station != nil) {
me["Simple_L4"].setText(" " ~ atsu.ATISInstances[3].station ~ "/" ~ (atsu.ATISInstances[3].type == 0 ? "ARR" : "DEP"));
me["Simple_L4"].setFont(default);
me["Simple_L4_Arrow"].show();
} else {
me["Simple_L4"].setText(" [ ]/[ ]");
me["Simple_L4"].setFont(symbol);
me["Simple_L4_Arrow"].hide();
}
if (atsu.ATISInstances[3].received) {
me["Simple_C4"].setText(" " ~ atsu.ATISInstances[3].receivedCode ~ " " ~ atsu.ATISInstances[3].receivedTime);
me["Simple_C4"].show();
} else {
me["Simple_C4"].hide();
}
if (atsu.ATISInstances[0].sent) {
me["ATISSend1"].hide();
} else {
me["ATISSend1"].show();
}
if (atsu.ATISInstances[1].sent) {
me["ATISSend2"].hide();
} else {
me["ATISSend2"].show();
}
if (atsu.ATISInstances[2].sent) {
me["ATISSend3"].hide();
} else {
me["ATISSend3"].show();
}
if (atsu.ATISInstances[3].sent) {
me["ATISSend4"].hide();
} else {
me["ATISSend4"].show();
}
} else if (page == "NOTIFICATION") {
if (!pageSwitch[i].getBoolValue()) {
me.defaultHideWithCenter();
@ -1225,21 +1513,21 @@ var canvas_MCDU_base = {
pageSwitch[i].setBoolValue(1);
}
if (atsu.AOC.server == 1) {
if (atsu.AOC.server.getValue() == "vatsim") {
me["Simple_R1"].setText("VATSIM ");
me["Simple_R2_Arrow"].show();
me["Simple_R3_Arrow"].hide();
} elsif (atsu.AOC.server == 0) {
} elsif (atsu.AOC.server.getValue() == "noaa") {
me["Simple_R1"].setText("NOAA ");
me["Simple_R2_Arrow"].hide();
me["Simple_R3_Arrow"].show();
}
if (atsu.ATIS.server == 1) {
if (atsu.ATIS.serverSel.getValue() == "vatsim") {
me["Simple_L1"].setText(" VATSIM");
me["Simple_L2_Arrow"].show();
me["Simple_L3_Arrow"].hide();
} elsif (atsu.ATIS.server == 0) {
} elsif (atsu.ATIS.serverSel.getValue() == "faa") {
me["Simple_L1"].setText(" FAA");
me["Simple_L2_Arrow"].hide();
me["Simple_L3_Arrow"].show();

View file

@ -12,7 +12,7 @@
viewBox="0 0 1024 864"
version="1.1"
id="svg2"
inkscape:version="1.0beta2 (2b71d25, 2019-12-03)"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="mcdu.svg">
<metadata
id="metadata375">
@ -37,17 +37,17 @@
guidetolerance="20"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:window-width="1440"
inkscape:window-height="819"
inkscape:window-width="1366"
inkscape:window-height="705"
id="namedview371"
showgrid="true"
inkscape:zoom="0.78947164"
inkscape:cx="929.63178"
inkscape:cy="751.57487"
inkscape:window-x="481"
inkscape:window-y="23"
inkscape:window-maximized="0"
inkscape:current-layer="WIND"
inkscape:zoom="3.1578866"
inkscape:cx="1122.1906"
inkscape:cy="986.92422"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg2"
showguides="false"
inkscape:snap-global="false"
units="px"
@ -1016,7 +1016,7 @@
inkscape:label="#g4241"
id="g4241">
<path
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 952.4036,47.432743 H 923.87395"
id="path4480-4"
inkscape:connector-curvature="0"
@ -1026,9 +1026,9 @@
inkscape:connector-curvature="0"
id="path4482-0"
d="M 936.70791,32.6968 921.8587,47.4328"
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 936.70791,62.1688 921.8587,47.4328"
id="path4484-0"
inkscape:connector-curvature="0"
@ -1069,7 +1069,7 @@
inkscape:label="#g4324"
id="g4324">
<path
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 998.71909,284.70793 H 970.18944"
id="path4490-7"
inkscape:connector-curvature="0"
@ -1079,9 +1079,9 @@
inkscape:connector-curvature="0"
id="path4318-2"
d="m 994.54102,294.79468 -20.17351,-20.1735"
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 984.45427,298.97275 -10e-6,-28.52964"
id="path4320-1"
inkscape:connector-curvature="0"
@ -1091,7 +1091,7 @@
inkscape:connector-curvature="0"
id="path4322-2"
d="m 974.36752,294.79468 20.17349,-20.1735"
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
</g>
</g>
@ -1103,7 +1103,7 @@
x="177.72771"
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:#ffff00;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:51.2px;line-height:1.25;font-family:BoeingCDULarge;-inkscape-font-specification:BoeingCDULarge;text-align:center;text-anchor:middle;fill:#ffffff;fill-opacity:1"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:51.20000076px;line-height:1.25;font-family:BoeingCDULarge;-inkscape-font-specification:BoeingCDULarge;text-align:center;text-anchor:middle;fill:#ffffff;fill-opacity:1"
y="68.861366"
x="177.72771"
id="tspan1240"
@ -1147,7 +1147,7 @@
inkscape:label="#g4241"
id="g186">
<path
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 952.4036,47.432743 H 923.87395"
id="path180"
inkscape:connector-curvature="0"
@ -1157,9 +1157,9 @@
inkscape:connector-curvature="0"
id="path182"
d="M 936.70791,32.6968 921.8587,47.4328"
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 936.70791,62.1688 921.8587,47.4328"
id="path184"
inkscape:connector-curvature="0"
@ -1200,7 +1200,7 @@
inkscape:label="#g4324"
id="g205">
<path
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 998.71909,284.70793 H 970.18944"
id="path197"
inkscape:connector-curvature="0"
@ -1210,9 +1210,9 @@
inkscape:connector-curvature="0"
id="path199"
d="m 994.54102,294.79468 -20.17351,-20.1735"
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 984.45427,298.97275 -10e-6,-28.52964"
id="path201"
inkscape:connector-curvature="0"
@ -1222,7 +1222,7 @@
inkscape:connector-curvature="0"
id="path203"
d="m 974.36752,294.79468 20.17349,-20.1735"
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
</g>
</g>
@ -1235,7 +1235,7 @@
inkscape:label="arrow5L"
id="arrow5L">
<path
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 952.4036,47.432743 H 923.87395"
id="path301"
inkscape:connector-curvature="0"
@ -1245,9 +1245,9 @@
inkscape:connector-curvature="0"
id="path303"
d="M 936.70791,32.6968 921.8587,47.4328"
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 936.70791,62.1688 921.8587,47.4328"
id="path305"
inkscape:connector-curvature="0"
@ -1263,9 +1263,9 @@
inkscape:connector-curvature="0"
id="path417"
d="M 952.4036,47.432743 H 923.87395"
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 936.70791,32.6968 921.8587,47.4328"
id="path419"
inkscape:connector-curvature="0"
@ -1275,7 +1275,7 @@
inkscape:connector-curvature="0"
id="path421"
d="M 936.70791,62.1688 921.8587,47.4328"
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
<g
style="stroke:#bb6100;stroke-opacity:1"
@ -1283,7 +1283,7 @@
inkscape:label="arrow3L"
id="arrow3L">
<path
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 952.4036,47.432743 H 923.87395"
id="path425"
inkscape:connector-curvature="0"
@ -1293,9 +1293,9 @@
inkscape:connector-curvature="0"
id="path427"
d="M 936.70791,32.6968 921.8587,47.4328"
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 936.70791,62.1688 921.8587,47.4328"
id="path429"
inkscape:connector-curvature="0"
@ -1311,9 +1311,9 @@
inkscape:connector-curvature="0"
id="path433"
d="M 952.4036,47.432743 H 923.87395"
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 936.70791,32.6968 921.8587,47.4328"
id="path435"
inkscape:connector-curvature="0"
@ -1323,7 +1323,7 @@
inkscape:connector-curvature="0"
id="path437"
d="M 936.70791,62.1688 921.8587,47.4328"
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
<g
style="stroke:#bb6100;stroke-opacity:1"
@ -1331,7 +1331,7 @@
inkscape:label="arrow1L"
id="arrow1L">
<path
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 952.4036,47.432743 H 923.87395"
id="path471"
inkscape:connector-curvature="0"
@ -1341,9 +1341,9 @@
inkscape:connector-curvature="0"
id="path473"
d="M 936.70791,32.6968 921.8587,47.4328"
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 936.70791,62.1688 921.8587,47.4328"
id="path475"
inkscape:connector-curvature="0"
@ -1359,9 +1359,9 @@
inkscape:connector-curvature="0"
id="path479"
d="M 952.4036,47.432743 H 923.87395"
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 936.70791,32.6968 921.8587,47.4328"
id="path481"
inkscape:connector-curvature="0"
@ -1371,7 +1371,7 @@
inkscape:connector-curvature="0"
id="path483"
d="M 936.70791,62.1688 921.8587,47.4328"
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
<g
style="stroke:#bb6100;stroke-opacity:1"
@ -1379,7 +1379,7 @@
inkscape:label="arrow4R"
id="arrow4R">
<path
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 952.4036,47.432743 H 923.87395"
id="path487"
inkscape:connector-curvature="0"
@ -1389,9 +1389,9 @@
inkscape:connector-curvature="0"
id="path489"
d="M 936.70791,32.6968 921.8587,47.4328"
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 936.70791,62.1688 921.8587,47.4328"
id="path491"
inkscape:connector-curvature="0"
@ -1407,9 +1407,9 @@
inkscape:connector-curvature="0"
id="path495"
d="M 952.4036,47.432743 H 923.87395"
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 936.70791,32.6968 921.8587,47.4328"
id="path497"
inkscape:connector-curvature="0"
@ -1419,7 +1419,7 @@
inkscape:connector-curvature="0"
id="path499"
d="M 936.70791,62.1688 921.8587,47.4328"
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
<g
style="stroke:#bb6100;stroke-opacity:1"
@ -1427,7 +1427,7 @@
inkscape:label="arrow2R"
id="arrow2R">
<path
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 952.4036,47.432743 H 923.87395"
id="path503"
inkscape:connector-curvature="0"
@ -1437,9 +1437,9 @@
inkscape:connector-curvature="0"
id="path505"
d="M 936.70791,32.6968 921.8587,47.4328"
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 936.70791,62.1688 921.8587,47.4328"
id="path507"
inkscape:connector-curvature="0"
@ -1455,9 +1455,9 @@
inkscape:connector-curvature="0"
id="path511"
d="M 952.4036,47.432743 H 923.87395"
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 936.70791,32.6968 921.8587,47.4328"
id="path513"
inkscape:connector-curvature="0"
@ -1467,7 +1467,7 @@
inkscape:connector-curvature="0"
id="path515"
d="M 936.70791,62.1688 921.8587,47.4328"
style="fill:none;stroke:#bb6100;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
</g>
</g>
@ -2617,7 +2617,7 @@
id="tspan1088"
x="478.87796"
y="171.04486"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:63.9924px;line-height:1.25;font-family:'Helvetica Medium';-inkscape-font-specification:'Helvetica Medium, Medium';text-align:start;text-anchor:start;fill:#ffffff;fill-opacity:1">=</tspan></text>
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:63.99240112px;line-height:1.25;font-family:'Helvetica Medium';-inkscape-font-specification:'Helvetica Medium, Medium';text-align:start;text-anchor:start;fill:#ffffff;fill-opacity:1">=</tspan></text>
<text
inkscape:label="#text4244"
transform="scale(0.90642126,1.1032398)"
@ -2626,7 +2626,7 @@
x="478.87796"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#ffffff;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:500;font-stretch:normal;font-size:63.9924px;line-height:1.25;font-family:'Helvetica Medium';-inkscape-font-specification:'Helvetica Medium, Medium';text-align:start;text-anchor:start;fill:#ffffff;fill-opacity:1"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:63.99240112px;line-height:1.25;font-family:'Helvetica Medium';-inkscape-font-specification:'Helvetica Medium, Medium';text-align:start;text-anchor:start;fill:#ffffff;fill-opacity:1"
y="278.32764"
x="478.87796"
id="tspan1091"
@ -2643,7 +2643,7 @@
id="tspan1094"
x="478.87796"
y="385.6102"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:63.9924px;line-height:1.25;font-family:'Helvetica Medium';-inkscape-font-specification:'Helvetica Medium, Medium';text-align:start;text-anchor:start;fill:#ffffff;fill-opacity:1">=</tspan></text>
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:63.99240112px;line-height:1.25;font-family:'Helvetica Medium';-inkscape-font-specification:'Helvetica Medium, Medium';text-align:start;text-anchor:start;fill:#ffffff;fill-opacity:1">=</tspan></text>
<g
style="stroke:#179ab7;stroke-opacity:1"
id="PERFAPPR_LDG_3"
@ -2654,9 +2654,9 @@
inkscape:connector-curvature="0"
id="path4376-0"
d="M 998.71909,284.70793 H 970.18944"
style="fill:none;stroke:#179ab7;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
style="fill:none;stroke:#179ab7;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:none;stroke:#179ab7;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
style="fill:none;stroke:#179ab7;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 994.54102,294.79468 -20.17351,-20.1735"
id="path4378-3"
inkscape:connector-curvature="0"
@ -2666,9 +2666,9 @@
inkscape:connector-curvature="0"
id="path4380-9"
d="m 984.45427,298.97275 -10e-6,-28.52964"
style="fill:none;stroke:#179ab7;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
style="fill:none;stroke:#179ab7;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:none;stroke:#179ab7;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
style="fill:none;stroke:#179ab7;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 974.36752,294.79468 20.17349,-20.1735"
id="path4382-8"
inkscape:connector-curvature="0"
@ -2680,7 +2680,7 @@
id="PERFAPPR_LDG_F"
style="stroke:#179ab7;stroke-opacity:1">
<path
style="fill:none;stroke:#179ab7;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
style="fill:none;stroke:#179ab7;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 998.71909,284.70793 H 970.18944"
id="path1181"
inkscape:connector-curvature="0"
@ -2690,9 +2690,9 @@
inkscape:connector-curvature="0"
id="path1183"
d="m 994.54102,294.79468 -20.17351,-20.1735"
style="fill:none;stroke:#179ab7;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
style="fill:none;stroke:#179ab7;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:none;stroke:#179ab7;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
style="fill:none;stroke:#179ab7;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 984.45427,298.97275 -10e-6,-28.52964"
id="path1185"
inkscape:connector-curvature="0"
@ -2702,7 +2702,7 @@
inkscape:connector-curvature="0"
id="path1187"
d="m 974.36752,294.79468 20.17349,-20.1735"
style="fill:none;stroke:#179ab7;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
style="fill:none;stroke:#179ab7;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
</g>
<g
@ -2825,7 +2825,7 @@
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:63.9924px;line-height:1.25;font-family:'Helvetica Medium';-inkscape-font-specification:'Helvetica Medium, Medium';text-align:start;text-anchor:start;fill:#ffffff;fill-opacity:1">=</tspan></text>
</g>
<g
style="stroke:#179ab7;stroke-opacity:1;opacity:0.94000004"
style="opacity:0.94000005;stroke:#179ab7;stroke-opacity:1"
id="NOTIFY"
inkscape:label="#g4324"
transform="matrix(1.0807111,0,0,1.0807111,-76.372598,-23.411021)">
@ -2833,7 +2833,7 @@
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path1243"
d="m 998.71909,284.70793 -28.52965,0"
d="M 998.71909,284.70793 H 970.18944"
style="fill:none;stroke:#179ab7;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:none;stroke:#179ab7;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
@ -3129,4 +3129,177 @@
d="m 974.36752,294.79468 20.17349,-20.1735"
style="fill:none;stroke:#179ab7;stroke-width:4.08;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
<g
transform="matrix(1.0807111,0,0,1.0807111,-76.372598,-141.09805)"
inkscape:label="#g4324"
id="ATISSend1"
style="opacity:0.94000005;stroke:#179ab7;stroke-opacity:1">
<path
style="fill:none;stroke:#179ab7;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 998.71909,284.70793 H 970.18944"
id="path506"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path508"
d="m 994.54102,294.79468 -20.17351,-20.1735"
style="fill:none;stroke:#179ab7;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:none;stroke:#179ab7;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 984.45427,298.97275 -10e-6,-28.52964"
id="path510"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path512"
d="m 974.36752,294.79468 20.17349,-20.1735"
style="fill:none;stroke:#179ab7;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
<g
transform="matrix(1.0807111,0,0,1.0807111,-76.372598,-23.411021)"
inkscape:label="#g4324"
id="ATISSend2"
style="opacity:0.94000005;stroke:#179ab7;stroke-opacity:1">
<path
style="fill:none;stroke:#179ab7;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 998.71909,284.70793 H 970.18944"
id="path1321"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path1323"
d="m 994.54102,294.79468 -20.17351,-20.1735"
style="fill:none;stroke:#179ab7;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:none;stroke:#179ab7;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 984.45427,298.97275 -10e-6,-28.52964"
id="path1325"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path1327"
d="m 974.36752,294.79468 20.17349,-20.1735"
style="fill:none;stroke:#179ab7;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
<g
transform="matrix(1.0807111,0,0,1.0807111,-76.462145,213.12578)"
inkscape:label="#g4324"
id="ATISSend4"
style="stroke:#179ab7;stroke-opacity:1">
<path
style="fill:none;stroke:#179ab7;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 998.71909,284.70793 H 970.18944"
id="path1331"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path1333"
d="m 994.54102,294.79468 -20.17351,-20.1735"
style="fill:none;stroke:#179ab7;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:none;stroke:#179ab7;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 984.45427,298.97275 -10e-6,-28.52964"
id="path1335"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path1337"
d="m 974.36752,294.79468 20.17349,-20.1735"
style="fill:none;stroke:#179ab7;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
<g
style="stroke:#179ab7;stroke-opacity:1"
id="ATISSend3"
inkscape:label="#g4324"
transform="matrix(1.0807111,0,0,1.0807111,-76.462145,94.951839)">
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path1341"
d="M 998.71909,284.70793 H 970.18944"
style="fill:none;stroke:#179ab7;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:none;stroke:#179ab7;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 994.54102,294.79468 -20.17351,-20.1735"
id="path1343"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path1345"
d="m 984.45427,298.97275 -10e-6,-28.52964"
style="fill:none;stroke:#179ab7;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:none;stroke:#179ab7;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 974.36752,294.79468 20.17349,-20.1735"
id="path1347"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
</g>
<g
transform="translate(220.36572,-474.55648)"
id="ATISArrows"
inkscape:label="#WIND_UPDOWN">
<g
id="g1338"
inkscape:label="#g4241"
transform="matrix(0,1,1,0,667.65035,-414.17373)"
style="stroke:#ffffff;stroke-opacity:1">
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path1332"
d="M 952.4036,47.432743 H 923.87395"
style="fill:none;stroke:#ffffff;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:none;stroke:#ffffff;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 936.70791,32.6968 921.8587,47.4328"
id="path1334"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path1336"
d="M 936.70791,62.1688 921.8587,47.4328"
style="fill:none;stroke:#ffffff;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
<g
style="stroke:#ffffff;stroke-opacity:1"
transform="matrix(0,-1,-1,0,801.59015,1459.2436)"
inkscape:label="#g4241"
id="g1346">
<path
style="fill:none;stroke:#ffffff;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 952.4036,47.432743 H 923.87395"
id="path1340"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path1342"
d="M 936.70791,32.6968 921.8587,47.4328"
style="fill:none;stroke:#ffffff;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:none;stroke:#ffffff;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 936.70791,62.1688 921.8587,47.4328"
id="path1344"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 162 KiB

After

Width:  |  Height:  |  Size: 171 KiB

View file

@ -335,12 +335,12 @@ canvas.NavDisplay.update_sub = func(){
canvas.NavDisplay.update = func() # FIXME: This stuff is still too aircraft specific, cannot easily be reused by other aircraft
{
var _time = systime();
# Disables WXR Live if it"s not enabled. The toggle_weather_live should be common to all
# Disables WXR Live if it's not enabled. The toggle_weather_live should be common to all
# ND instances.
var wxr_live_enabled = getprop(wxr_live_tree~"/enabled");
if(wxr_live_enabled == nil or wxr_live_enabled == "")
var wxr_live_enabled = getprop(wxr_live_tree~'/enabled');
if(wxr_live_enabled == nil or wxr_live_enabled == '')
wxr_live_enabled = 0;
me.set_switch("toggle_weather_live", wxr_live_enabled);
me.set_switch('toggle_weather_live', wxr_live_enabled);
call(me.update_sub, nil, nil, caller(0)[0]); # call this in the same namespace to "steal" its variables
# MapStructure update!

View file

@ -25,16 +25,9 @@ var new = func(layer) {
};
layer.searcher._equals = func(l,r) l.equals(r);
m.addVisibilityListener();
var aircraft_dir = split('/', getprop("sim/aircraft-dir"))[-1];
var saved_conf = getprop("sim/fg-home") ~ "/Export/wxr_api.xml";
var df_conf = getprop("sim/fg-root") ~ "/Aircraft/" ~ aircraft_dir ~
"/Models/Instruments/ND/canvas/wxr_api.xml";
if(io.stat(saved_conf) != nil)
io.read_properties(saved_conf, wxr_tree);
else
io.read_properties(df_conf, wxr_tree);
return m;
};
var del = func() {
#print(name~".lcontroller.del()");
foreach (var l; me.listeners)
@ -43,9 +36,6 @@ var del = func() {
var searchCmd = func {
if(me.map.getRange() == nil) return [];
var api_key = getprop(wxr_tree~"/api-key");
if(!api_key or api_key == '' or api_key == 'YOUR API KEY')
return [];
var lat = getprop(wxr_tree~"/center/latitude-deg");
var lon = getprop(wxr_tree~"/center/longitude-deg");
@ -58,14 +48,9 @@ var searchCmd = func {
var result = geo.Coord.new();
result.set_latlon(lat, lon);
result.rangeNm = me.map.getRange();
result.key = api_key;
result.res = getprop(wxr_tree~"/resolution");
result.ltype = getprop(wxr_tree~"/layer-type");
result.smooth = getprop(wxr_tree~"/smooth");
result.fetchRad = getprop(wxr_tree~"/fetch-radius");
result.fetchRad = 184; # is this number accurate?
result.equals = func(r){
me.ltype == r.ltype and me.fetchRad == r.fetchRad and
me.lat == r.lat and me.lon == r.lon
me.fetchRad == r.fetchRad and me.lat == r.lat and me.lon == r.lon
};
return [result];

View file

@ -11,19 +11,18 @@ var getWXRImageFilePath = func(){
var home = getprop('sim/fg-home');
var aircraft = getprop('sim/aircraft');
var idx = me.layer.getCanvas()._node.getIndex();
return home ~ '/Export/' ~ aircraft ~ '-wxr-'~me.ltype~'-'~idx~'.png';
return home ~ '/Export/' ~ aircraft ~ '-wxr-'~idx~'.png';
};
var processRequest = func(r) {
var splitVector = split(",", r.response);
var timeStamp = split("]",splitVector[size(splitVector) - 1]);
return timeStamp[0];
};
var getWXRAPIUrl = func(lat, lon){
var res = me.res;
if(me.ltype == "radar"){
return "http://api.wunderground.com/api/"~me.key~
"/radar/image.png?centerlat="~lat~"&centerlon="~lon~
"&radius="~me.fetchRad~"&width="~res~"&height="~res~
"&smooth="~me.smooth;
} else {
return nil;
}
if (me.timeStamp == nil) { return nil; }
return "https://tilecache.rainviewer.com/v2/radar/" ~ sprintf("%s",me.timeStamp) ~ "/512/5/" ~ lat ~ "/" ~ lon ~ "/7/0_0.png";
};
var fetchWXRMap = func(size){
@ -34,15 +33,14 @@ var fetchWXRMap = func(size){
var url = me.getWXRAPIUrl(lat, lon);
var filePath = me.getWXRImageFilePath();
if(url == nil) {
print(me.name~': No URL!');
logprint(3,me.name,": No URL!");
return;
}
me.fetching = 1;
http.save(url, filePath)
.fail(func(){
print(me.name~': Download failed!');
me.wxlayer.hide();
})
logprint(3,me.name,":Download failed!");}
)
.done(func(){
var sz = size * 2;
var transl = -size;
@ -57,28 +55,28 @@ var fetchWXRMap = func(size){
setprop("instrumentation/wxr/center/latitude-deg", lat);
setprop("instrumentation/wxr/center/longitude-deg", lon);
me.fetching = 0;
print("[WXR] Live Layer Request: "~url); # Debugging
logprint(4,me.name,": Layer Request: ",url);
});
};
var init = func {
#print('WXR init');
me.fetching = 0;
me.key = me.model.key; # API Key from Wunderground API Subscription
me.res = me.model.res; # Resolution of image to fetch (default 2048)
me.ltype = me.model.ltype; # Layer Type - radar, satellite
me.smooth = me.model.smooth; # If we should fetch a smoothened image or the original
me.timeStamp = nil;
me.fetchRad = me.model.fetchRad; # Radius of radar layer to fetch
me.range = me.model.rangeNm; # Range of Navigation Display
me.viewport_radius = me.getOption('viewport_radius', 670);
me.wxlayer = me.element.createChild("image").set("z-index", -100).hide();
me.last_request = -210;
me.update_interval = 240;
me.last_request = -600;
me.update_interval = 600;
var r_scaled = (me.fetchRad*me.viewport_radius)/me.range;
me.fetchWXRMap(r_scaled);
me.timeStamp = nil;
http.load("https://api.rainviewer.com/public/maps.json").done(func(r) me.timeStamp = processRequest(r));
};
var draw = func {
@ -86,15 +84,12 @@ var draw = func {
var update_size = (range != me.range);
me.range = range;
me.fetchRad = me.model.fetchRad; # Radius of radar layer to fetch
#var r_scaled = (me.fetchRad*670)/me.range;
var r_scaled = (me.fetchRad*me.viewport_radius)/me.range;
var hdg = me.layer.map.getHdg();
var rot = 0 - hdg;
if(rot < 0) rot = 360 + rot;
if(rot < 0) rot = 360 + rot + -getprop("/environment/magnetic-variation-deg");
me.element.setRotation(rot*D2R);
if(update_size){
print('WXR draw range:'~ me.range);
print('Update size: '~r_scaled~'x2 = '~(r_scaled*2));
me.wxlayer.hide();
me.wxlayer.setSize(2*r_scaled, 2*r_scaled)
.setTranslation(-r_scaled, -r_scaled);
@ -102,12 +97,6 @@ var draw = func {
}
if(getprop("sim/time/elapsed-sec") - me.last_request > me.update_interval) {
#print('Fetching WXR map...');
me.key = me.model.key; # API Key from Wunderground API Subscription
me.res = me.model.res; # Resolution of image to fetch (default 2048)
me.ltype = me.model.ltype; # Layer Type - radar, satellite
me.smooth = me.model.smooth; # If we should fetch a smoothened image or the original
me.fetchWXRMap(r_scaled);
}
};

View file

@ -15,6 +15,8 @@ var updateR = 0;
var elapsedtime = 0;
var altTens = 0;
var altPolarity = "";
var track_diff = 0;
var AICenter = nil;
# Fetch nodes:
var state1 = props.globals.getNode("/systems/thrust/state1", 1);
@ -34,7 +36,7 @@ var thr2 = props.globals.getNode("/controls/engines/engine[1]/throttle-pos", 1);
var wow0 = props.globals.getNode("/gear/gear[0]/wow");
var wow1 = props.globals.getNode("/gear/gear[1]/wow");
var wow2 = props.globals.getNode("/gear/gear[2]/wow");
var pitch = props.globals.getNode("/orientation/pitch-deg", 1);
var pitch = props.globals.getNode("/instrumentation/pfd/pitch-deg-non-linear", 1);
var roll = props.globals.getNode("/orientation/roll-deg", 1);
var elapsedtime = props.globals.getNode("/sim/time/elapsed-sec", 1);
var du1_lgt = props.globals.getNode("/controls/lighting/DU/du1", 1);
@ -126,6 +128,16 @@ var inner_marker = props.globals.getNode("/instrumentation/marker-beacon/inner",
var flap_config = props.globals.getNode("/controls/flight/flaps-input", 1);
var hundredAbove = props.globals.getNode("/instrumentation/pfd/hundred-above", 1);
var minimum = props.globals.getNode("/instrumentation/pfd/minimums", 1);
var aoa_1 = props.globals.getNode("/systems/navigation/adr/output/aoa-1", 1);
var aoa_2 = props.globals.getNode("/systems/navigation/adr/output/aoa-2", 1);
var aoa_3 = props.globals.getNode("/systems/navigation/adr/output/aoa-3", 1);
var adr_1_switch = props.globals.getNode("/controls/navigation/adirscp/switches/adr-1", 1);
var adr_2_switch = props.globals.getNode("/controls/navigation/adirscp/switches/adr-2", 1);
var adr_3_switch = props.globals.getNode("/controls/navigation/adirscp/switches/adr-3", 1);
var adr_1_fault = props.globals.getNode("/controls/navigation/adirscp/lights/adr-1-fault", 1);
var adr_2_fault = props.globals.getNode("/controls/navigation/adirscp/lights/adr-2-fault", 1);
var adr_3_fault = props.globals.getNode("/controls/navigation/adirscp/lights/adr-3-fault", 1);
var air_data_switch = props.globals.getNode("/controls/navigation/switching/air-data", 1);
# Create Nodes:
var alt_diff = props.globals.initNode("/instrumentation/pfd/alt-diff", 0.0, "DOUBLE");
@ -137,7 +149,7 @@ var horizon_ground = props.globals.initNode("/instrumentation/pfd/horizon-ground
var hdg_diff = props.globals.initNode("/instrumentation/pfd/hdg-diff", 0.0, "DOUBLE");
var hdg_scale = props.globals.initNode("/instrumentation/pfd/heading-scale", 0.0, "DOUBLE");
var track = props.globals.initNode("/instrumentation/pfd/track-deg", 0.0, "DOUBLE");
var track_diff = props.globals.initNode("/instrumentation/pfd/track-hdg-diff", 0.0, "DOUBLE");
#var track_diff = props.globals.initNode("/instrumentation/pfd/track-hdg-diff", 0.0, "DOUBLE"); # returns incorrect value
var du1_test = props.globals.initNode("/instrumentation/du/du1-test", 0, "BOOL");
var du1_test_time = props.globals.initNode("/instrumentation/du/du1-test-time", 0.0, "DOUBLE");
var du1_offtime = props.globals.initNode("/instrumentation/du/du1-off-time", 0.0, "DOUBLE");
@ -200,6 +212,9 @@ var canvas_PFD_base = {
me.AI_horizon_hdg_trans = me["AI_heading"].createTransform();
me.AI_horizon_hdg_rot = me["AI_heading"].createTransform();
me.AI_fpv_trans = me["FPV"].createTransform();
me.AI_fpv_rot = me["FPV"].createTransform();
me.page = canvas_group;
return me;
@ -212,7 +227,7 @@ var canvas_PFD_base = {
"AI_agl_g","AI_agl","AI_error","AI_group","FD_roll","FD_pitch","ALT_box_flash","ALT_box","ALT_box_amber","ALT_scale","ALT_target","ALT_target_digit","ALT_one","ALT_two","ALT_three","ALT_four","ALT_five","ALT_digits","ALT_tens","ALT_digit_UP",
"ALT_digit_DN","ALT_error","ALT_group","ALT_group2","ALT_frame","VS_pointer","VS_box","VS_digit","VS_error","VS_group","QNH","QNH_setting","QNH_std","QNH_box","LOC_pointer","LOC_scale","GS_scale","GS_pointer","CRS_pointer","HDG_target","HDG_scale",
"HDG_one","HDG_two","HDG_three","HDG_four","HDG_five","HDG_six","HDG_seven","HDG_digit_L","HDG_digit_R","HDG_error","HDG_group","HDG_frame","TRK_pointer","machError","ilsError","ils_code","ils_freq","dme_dist","dme_dist_legend","ILS_HDG_R","ILS_HDG_L",
"ILS_right","ILS_left","outerMarker","middleMarker","innerMarker","v1_group","v1_text","vr_speed","F_target","S_target","FS_targets","flap_max","clean_speed","ground","ground_ref","spdLimError"];
"ILS_right","ILS_left","outerMarker","middleMarker","innerMarker","v1_group","v1_text","vr_speed","F_target","S_target","FS_targets","flap_max","clean_speed","ground","ground_ref","FPV","spdLimError"];
},
updateDu1: func() {
var elapsedtime_act = elapsedtime.getValue();
@ -961,12 +976,15 @@ var canvas_PFD_base = {
me["HDG_target"].hide();
}
me["TRK_pointer"].setTranslation((math.clamp(track_diff.getValue(), -23.62, 23.62) / 10) * 98.5416, 0);
var heading_deg = heading.getValue();
track_diff = geo.normdeg180(track.getValue() - heading_deg);
me["TRK_pointer"].setTranslation(me.getTrackDiffPixels(track_diff),0);
split_ils = split("/", ils_data1.getValue());
if (ap_ils_mode.getValue() == 1 and size(split_ils) == 2) {
magnetic_hdg = ils_crs.getValue();
magnetic_hdg_dif = geo.normdeg180(magnetic_hdg - heading.getValue());
magnetic_hdg_dif = geo.normdeg180(magnetic_hdg - heading_deg);
if (magnetic_hdg_dif >= -23.62 and magnetic_hdg_dif <= 23.62) {
me["CRS_pointer"].setTranslation((magnetic_hdg_dif / 10) * 98.5416, 0);
me["ILS_HDG_R"].hide();
@ -1010,6 +1028,28 @@ var canvas_PFD_base = {
me.AI_horizon_hdg_rot.setRotation(-roll_cur * D2R, me["AI_center"].getCenter());
me["AI_heading"].update();
},
# Get Angle of Attack from ADR1 or, depending on Switching panel, ADR3
getAOAForPFD1: func() {
if (air_data_switch.getValue() != -1 and adr_1_switch.getValue() and !adr_1_fault.getValue()) return aoa_1.getValue();
if (air_data_switch.getValue() == -1 and adr_3_switch.getValue() and !adr_3_fault.getValue()) return aoa_3.getValue();
return nil;
},
# Get Angle of Attack from ADR2 or, depending on Switching panel, ADR3
getAOAForPFD2: func() {
if (air_data_switch.getValue() != 1 and adr_2_switch.getValue() and !adr_2_fault.getValue()) return aoa_2.getValue();
if (air_data_switch.getValue() == 1 and adr_3_switch.getValue() and !adr_3_fault.getValue()) return aoa_3.getValue();
return nil;
},
# Convert difference between magnetic heading and track measured in degrees to pixel for display on PFDs
# And set max and minimum values
getTrackDiffPixels: func(track_diff_deg) {
return ((math.clamp(track_diff_deg, -23.62, 23.62) / 10) * 98.5416);
},
};
var canvas_PFD_1 = {
@ -1087,6 +1127,26 @@ var canvas_PFD_1 = {
me["FD_pitch"].hide();
}
# If TRK FPA selected, display FPV on PFD1
if (ap_trk_sw.getValue() == 0 ) {
me["FPV"].hide();
} else {
var aoa = me.getAOAForPFD1();
if (aoa == nil or (systems.ADIRS.ADIRunits[0].aligned != 1 and att_switch.getValue() == 0) or (systems.ADIRS.ADIRunits[2].aligned != 1 and att_switch.getValue() == -1)){
me["FPV"].hide();
} else {
var roll_deg = roll.getValue() or 0;
AICenter = me["AI_center"].getCenter();
var track_x_translation = me.getTrackDiffPixels(track_diff);
me.AI_fpv_trans.setTranslation(track_x_translation, math.clamp(aoa, -20, 20) * 12.5);
me.AI_fpv_rot.setRotation(-roll_deg * D2R, AICenter);
me["FPV"].setRotation(roll_deg * D2R); # It shouldn't be rotated, only the axis should be
me["FPV"].show();
}
}
# ILS
if (ap_ils_mode.getValue() == 1) {
me["LOC_scale"].show();
@ -1842,6 +1902,25 @@ var canvas_PFD_2 = {
me["FD_pitch"].hide();
}
# If TRK FPA selected, display FPV on PFD2
if (ap_trk_sw.getValue() == 0 ) {
me["FPV"].hide();
} else {
var aoa = me.getAOAForPFD2();
if (aoa == nil or (systems.ADIRS.ADIRunits[1].aligned != 1 and att_switch.getValue() == 0) or (systems.ADIRS.ADIRunits[2].aligned != 1 and att_switch.getValue() == 1)) {
me["FPV"].hide();
} else {
var roll_deg = roll.getValue() or 0;
AICenter = me["AI_center"].getCenter();
var track_x_translation = me.getTrackDiffPixels(track_diff);
me.AI_fpv_trans.setTranslation(track_x_translation, math.clamp(aoa, -20, 20) * 12.5);
me.AI_fpv_rot.setRotation(-roll_deg * D2R, AICenter);
me["FPV"].setRotation(roll_deg * D2R); # It shouldn't be rotated, only the axis should be
me["FPV"].show();
}
}
# ILS
if (ap_ils_mode2.getValue() == 1) {
me["LOC_scale"].show();

File diff suppressed because it is too large Load diff

Before

Width:  |  Height:  |  Size: 368 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);
@ -1403,10 +1349,12 @@ var messages_priority_2 = func {
if (yawDamperSysFault.clearFlag == 0 and phaseVar2 != 4 and phaseVar2 != 5 and phaseVar2 != 7 and phaseVar2 != 8 and phaseVar2 != 10 and warningNodes.Logic.yawDamper12Fault.getBoolValue()) {
yawDamperSysFault.active = 1;
yawDamperSysFaultFac.active = 1;
yawDamperSysFaultFac1.active = 1;
yawDamperSysFaultFac2.active = 1;
} else {
ECAM_controller.warningReset(yawDamperSysFault);
ECAM_controller.warningReset(yawDamperSysFaultFac);
ECAM_controller.warningReset(yawDamperSysFaultFac1);
ECAM_controller.warningReset(yawDamperSysFaultFac2);
}
if (rudTravLimSysFault.clearFlag == 0 and phaseVar2 != 4 and phaseVar2 != 5 and phaseVar2 != 7 and phaseVar2 != 8 and warningNodes.Logic.rtlu12Fault.getBoolValue()) {
@ -2407,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";
@ -2480,6 +2428,11 @@ var messages_memo = func {
gpws_flap_mode_off.active = 0;
}
if (!fmgc.FMGCInternal.flightNumSet and toMemoLine1.active != 1 and ldgMemoLine1.active != 1 and (phaseVarMemo2 <= 2 or phaseVarMemo2 == 6 or phaseVarMemo2 >= 9)) {
company_datalink_stby.active = 1;
} else {
company_datalink_stby.active = 0;
}
}
var messages_right_memo = func {
@ -2623,6 +2576,12 @@ var messages_right_memo = func {
ldg_lt.active = 0;
}
if (mcdu.ReceivedMessagesDatabase.firstUnviewed() != -99 and (phaseVarMemo2 <= 2 or phaseVarMemo2 == 6 or phaseVarMemo2 >= 9)) {
company_msg.active = 1;
} else {
company_msg.active = 0;
}
if (getprop("/controls/ice-protection/leng") == 1 or getprop("/controls/ice-protection/reng") == 1 or getprop("/systems/electrical/bus/dc-1") == 0 or getprop("/systems/electrical/bus/dc-2") == 0) {
eng_aice.active = 1;
} else {

View file

@ -287,7 +287,8 @@ var warnings = std.Vector.new([
var fac12FaultSuccess = warning.new(msg: " •IF UNSUCCESSFUL :", colour: "w"),
var fac12FaultFacOff = warning.new(msg: " -FAC 1+2............OFF", colour: "c"),
var yawDamperSysFault = warning.new(msg: "AUTO FLT YAW DAMPER SYS", colour: "a", aural: 1, light: 1, isMainMsg: 1),
var yawDamperSysFaultFac = warning.new(msg: " -FAC 1+2....OFF THEN ON", colour: "c"),
var yawDamperSysFaultFac1 = warning.new(msg: " -FAC 1......OFF THEN ON", colour: "c"),
var yawDamperSysFaultFac2 = warning.new(msg: " -FAC 2......OFF THEN ON", colour: "c"),
# var rudderTrimSysFault = warning.new(msg: "AUTO FLT RUD TRIM SYS", colour: "a", aural: 1, light: 1, isMainMsg: 1), not implemented
# var rudderTrimSysFaultFac = warning.new(msg: " -FAC 1+2....OFF THEN ON", colour: "c"),
var rudTravLimSysFault = warning.new(msg: "AUTO FLT RUD TRV LIM SYS", colour: "a", aural: 1, light: 1, isMainMsg: 1),
@ -542,11 +543,9 @@ var memos = std.Vector.new([
var pred_ws_off = memo.new(msg: "PRED W/S OFF"), # Not yet implemented
var terr_stby = memo.new(msg: "TERR STBY" ), # Not yet implemented
var tcas_stby = memo.new(msg: "TCAS STBY" ), # Not yet implemented
var acars_call = memo.new(msg: "ACARS CALL" ), # Not yet implemented
var company_call = memo.new(msg: "COMPANY CALL"),
var satcom_alert = memo.new(msg: "SATCOM ALERT"), # Not yet implemented
var acars_msg = memo.new(msg: "ACARS MSG" ), # Not yet implemented
var company_msg = memo.new(msg: "COMPANY MSG" ), # Not yet implemented
var company_msg = memo.new(msg: "COMPANY MSG" ),
var eng_aice = memo.new(msg: "ENG A.ICE" ),
var wing_aice = memo.new(msg: "WING A.ICE" ),
var ice_not_det = memo.new(msg: "ICE NOT DET" ), # Not yet implemented
@ -560,7 +559,6 @@ var memos = std.Vector.new([
var gpws_flap3 = memo.new(msg: "GPWS FLAP 3" ),
var hf_data_ovrd = memo.new(msg: "HF DATA OVRD"), # Not yet implemented
var hf_voice = memo.new(msg: "HF VOICE" ), # Not yet implemented
var acars_stby = memo.new(msg: "ACARS STBY" ), # Not yet implemented
var vhf3_voice = memo.new(msg: "VHF3 VOICE" ),
var auto_brk_lo = memo.new(msg: "AUTO BRK LO" ),
var auto_brk_med = memo.new(msg: "AUTO BRK MED"),

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 = {
@ -29,7 +24,7 @@ var FWC = {
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-output"),
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"),
@ -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,8 +107,8 @@ var phaseLoop = func() {
FWC.Flipflop.phase10Reset.setBoolValue(0);
}
if ((FWC.Logic.gnd.getBoolValue() and twoEngOff and myPhase == 9) and FWC.Flipflop.phase10Output.getBoolValue()) {
FWC.Monostable.phase1.setBoolValue(1);
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

@ -247,6 +247,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

@ -14,7 +14,14 @@ var SimbriefParser = {
var stamp = systime();
http.save("https://www.simbrief.com/api/xml.fetcher.php?username=" ~ username, getprop('/sim/fg-home') ~ "/Export/A320-family-simbrief.xml")
.fail(func me.failure(i))
.done(func me.read(getprop('/sim/fg-home') ~ "/Export/A320-family-simbrief.xml", i));
.done(func {
var errs = [];
call(me.read, [(getprop('/sim/fg-home') ~ "/Export/A320-family-simbrief.xml"),i], SimbriefParser, {}, errs);
if (size(errs) > 0) {
debug.printerror(errs);
me.failure(i);
}
});
},
failure: func(i) {
mcdu.mcdu_message(i, "SIMBRIEF DOWNLOAD FAILED");
@ -25,141 +32,202 @@ var SimbriefParser = {
if (data != nil) {
if (data.getChild("OFP") == nil) {
print("XML file " ~ xml ~ " not a valid Simbrief file");
me.failure(i);
return;
} else {
me.node = data;
me.parseOFP();
if (me.parseOFP() == nil) {
print("Failure to parse Simbrief OFP");
me.failure(i);
} else {
mcdu.mcdu_message(i, "AOC ACT F-PLN UPLINK");
}
}
} else {
print("Error reading " ~ xml);
me.failure(i);
}
},
tryFindByCoord: func(coords, id, type) {
var result = nil;
if (type == "nav") {
result = findNavaidsByID(id);
} elsif (type == "fix") {
result = findFixesByID(id);
} else {
return nil;
}
if (size(result) == 0) { return nil; }
foreach (var test; result) {
if (math.abs(test.lat - coords.lat()) < 0.01666666666 and math.abs(test.lon - coords.lon()) < 0.01666666666) {
return test;
}
}
return nil;
},
buildFlightplan: func() {
# Flightplan stuff
fmgc.flightPlanController.flightplans[3] = createFlightplan();
fmgc.flightPlanController.flightplans[3].cleanPlan();
# INITA
var departureID = me.OFP.getNode("origin/icao_code").getValue();
var departures = findAirportsByICAO(departureID);
var destinationID = me.OFP.getNode("destination/icao_code").getValue();
var destinations = findAirportsByICAO(destinationID);
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.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);
fmgc.updateArptLatLon();
fmgc.updateARPT();
} else {
me.cleanupInvalid();
return nil;
}
var runwayStore = departures[0].runways[me.OFP.getNode("origin/plan_rwy").getValue()];
if (runwayStore != nil) {
fmgc.flightPlanController.flightplans[3].departure_runway = runwayStore;
}
runwayStore = destinations[0].runways[me.OFP.getNode("destination/plan_rwy").getValue()];
if (runwayStore != nil) {
fmgc.flightPlanController.flightplans[3].destination_runway = runwayStore;
}
var alternateID = me.OFP.getNode("alternate/icao_code").getValue();
var alternates = findAirportsByICAO(alternateID);
if (alternates != nil and size(alternates) != 0) {
fmgc.FMGCInternal.altAirport = alternateID;
atsu.ATISInstances[2].newStation(alternateID);
fmgc.FMGCInternal.altAirportSet = 1;
}
var wps = [];
var ofpNavlog = me.OFP.getNode("navlog");
var ofpFixes = ofpNavlog.getChildren("fix");
var ident = "";
var coords = nil;
var wp = nil;
var _foundSID = 0;
var _foundSTAR = 0;
var _foundTOC = 0;
var _foundTOD = 0;
var _sid = nil;
var _star = nil;
foreach (var ofpFix; ofpFixes) {
if (ofpFix.getNode("is_sid_star").getBoolValue()) {
if (!_foundSID) {
_sid = fmgc.flightPlanController.flightplans[3].departure.getSid(ofpFix.getNode("via_airway").getValue());
if (_sid != nil) {
_foundSID = 1;
}
}
}
if (ofpFix.getNode("is_sid_star").getBoolValue()) {
if (!_foundSTAR) {
_star = fmgc.flightPlanController.flightplans[3].destination.getStar(ofpFix.getNode("via_airway").getValue());
if (_star != nil) {
_foundSTAR = 1;
}
}
}
if (ofpFix.getNode("is_sid_star").getBoolValue() and _foundSID and _foundSTAR) {
continue;
} # todo what happens if you don't find one but find the other
ident = ofpFix.getNode("ident").getValue();
if (find(departureID, ident) != -1 or find(destinationID, ident) != -1) {
continue;
}
if (ident == "TOC") {
_foundTOC = 1;
continue;
}
if (ident == "TOD") {
_foundTOC = 1;
continue;
}
coords = geo.Coord.new();
coords.set_latlon(
ofpFix.getNode("pos_lat").getValue(),
ofpFix.getNode("pos_long").getValue());
wp = me.tryFindByCoord(coords,ident,"fix");
wp = me.tryFindByCoord(coords,ident,"nav");
if (wp == nil) {
wp = createWP(coords, ident);
}
append(wps, wp);
}
fmgc.flightPlanController.flightplans[3].insertWaypoints(wps, 1);
if (_sid != nil) {
fmgc.flightPlanController.flightplans[3].sid = _sid;
}
if (_star != nil) {
fmgc.flightPlanController.flightplans[3].star = _star;
}
fmgc.flightPlanController.destroyTemporaryFlightPlan(3, 1);
fmgc.windController.updatePlans();
fmgc.updateRouteManagerAlt();
return 1;
},
parseOFP: func() {
me.OFP = me.node.getChild("OFP");
me.store1 = nil;
me.store2 = nil;
me.store1 = me.OFP.getChild("params");
var units = me.store1.getChild("units").getValue();
me.store1 = me.OFP.getChild("general");
me.store2 = me.OFP.getChild("alternate");
fmgc.FMGCInternal.flightNum = (me.store1.getChild("icao_airline").getValue() or "") ~ (me.store1.getChild("flight_number").getValue() or "");
if (me.buildFlightplan() == nil) {
return nil;
}
fmgc.FMGCInternal.flightNum = (me.OFP.getNode("general/icao_airline").getValue() or "") ~ (me.OFP.getNode("general/flight_number").getValue() or "");
fmgc.FMGCInternal.flightNumSet = 1;
fmgc.FMGCInternal.costIndex = me.store1.getChild("costindex").getValue();
fmgc.FMGCInternal.costIndex = me.OFP.getNode("general/costindex").getValue();
fmgc.FMGCInternal.costIndexSet = 1;
fmgc.FMGCNodes.costIndex.setValue(fmgc.FMGCInternal.costIndex);
fmgc.FMGCInternal.tropo = me.store1.getChild("avg_tropopause").getValue();
fmgc.FMGCInternal.tropo = me.OFP.getNode("general/avg_tropopause").getValue();
fmgc.FMGCInternal.tropoSet = 1;
fmgc.FMGCInternal.crzFt = me.store1.getChild("initial_altitude").getValue();
fmgc.FMGCInternal.crzFl = me.store1.getChild("initial_altitude").getValue() / 100;
fmgc.altvert();
fmgc.FMGCInternal.crzSet = 1;
# Set cruise altitude
fmgc.FMGCInternal.crzFt = me.OFP.getNode("general/initial_altitude").getValue();
fmgc.FMGCInternal.crzFl = fmgc.FMGCInternal.crzFt / 100;
fmgc.FMGCInternal.crzTemp = (((fmgc.FMGCInternal.crzFt / 1000) * -2) + 15) + me.OFP.getNode("general/avg_temp_dev").getValue();
fmgc.FMGCInternal.crzProg = fmgc.FMGCInternal.crzFt / 100;
mcdu.updateCrzLvlCallback();
fmgc.FMGCInternal.crzTemp = (((me.store1.getChild("initial_altitude").getValue() / 1000) * -2) + 15) + me.store1.getChild("avg_temp_dev").getValue();
fmgc.FMGCInternal.crzTempSet = 1;
fmgc.FMGCInternal.crzProg = me.store1.getChild("initial_altitude").getValue() / 100;
if (num(me.store1.getChild("avg_wind_comp").getValue()) >= 0) {
fmgc.FMGCInternal.tripWind = "TL" ~ abs(me.store1.getChild("avg_wind_comp").getValue());
fmgc.FMGCInternal.crzSet = 1;
fmgc.altvert();
var windComp = me.OFP.getNode("general/avg_wind_comp").getValue();
if (num(windComp) >= 0) {
fmgc.FMGCInternal.tripWind = "TL" ~ abs(windComp);
} else {
fmgc.FMGCInternal.tripWind = "HD" ~ abs(me.store1.getChild("avg_wind_comp").getValue());
fmgc.FMGCInternal.tripWind = "HD" ~ abs(windComp);
}
fmgc.FMGCInternal.tripWindValue = abs(me.store1.getChild("avg_wind_comp").getValue());
fmgc.FMGCInternal.altAirport = me.store2.getChild("icao_code").getValue();
fmgc.FMGCInternal.altAirportSet = 1;
# Flightplan stuff
fmgc.flightPlanController.flightplans[3] = createFlightplan();
# INITA
me.store1 = me.OFP.getChild("origin");
me.store2 = me.OFP.getChild("destination");
fmgc.FMGCInternal.depApt = me.store1.getChild("icao_code").getValue();
fmgc.FMGCInternal.arrApt = me.store2.getChild("icao_code").getValue();
fmgc.FMGCInternal.toFromSet = 1;
fmgc.FMGCNodes.toFromSet.setValue(1);
fmgc.flightPlanController.flightplans[3].departure = airportinfo(fmgc.FMGCInternal.depApt);
fmgc.flightPlanController.flightplans[3].destination = airportinfo(fmgc.FMGCInternal.arrApt);
fmgc.FMGCInternal.altSelected = 0;
fmgc.updateArptLatLon();
fmgc.updateARPT();
call(func() {
fmgc.flightPlanController.flightplans[3].departure_runway = airportinfo(fmgc.FMGCInternal.depApt).runways[me.store1.getChild("plan_rwy").getValue()];
fmgc.flightPlanController.flightplans[3].destination_runway = airportinfo(fmgc.FMGCInternal.arrApt).runways[me.store2.getChild("plan_rwy").getValue()];
});
me.store1 = me.OFP.getChild("navlog").getChildren();
if (size(me.store1) != 0) {
var firstIsSID = 0;
var SIDID = "";
if (me.store1[0].getChild("is_sid_star").getValue() == 1) {
if (fmgc.flightPlanController.flightplans[3].departure.getSid(me.store1[0].getChild("via_airway").getValue()) != nil) {
firstIsSID = 1;
SIDID = me.store1[0].getChild("via_airway").getValue();
}
}
var lastIsSTAR = 0;
var STARID = "";
if (me.store1[-1].getChild("is_sid_star").getValue() == 1) {
if (fmgc.flightPlanController.flightplans[3].destination.getStar(me.store1[-1].getChild("via_airway").getValue()) != nil) {
lastIsSTAR = 1;
STARID = me.store1[-1].getChild("via_airway").getValue();
}
}
var lastSIDIndex = -999;
var firstSTARIndex = -999;
var TOCinSIDflag = 0;
var TODinSTARflag = 0;
for (var i = 0; i < size(me.store1); i = i + 1) {
if (firstIsSID) {
if (me.store1[i].getChild("is_sid_star").getValue() == 0 or me.store1[i].getChild("via_airway").getValue() != SIDID) {
lastSIDIndex = i - 1;
break;
}
}
}
for (var i = lastSIDIndex == -999 ? 0 : lastSIDIndex; i < size(me.store1); i = i + 1) {
if (STARID != "") {
if (me.store1[i].getChild("is_sid_star").getValue() == 1 and me.store1[i].getChild("via_airway").getValue() == STARID) {
firstSTARIndex = i;
break;
}
}
}
var max = firstSTARIndex == -999 ? size(me.store1) - 1 : firstSTARIndex - 1;
for (var i = lastSIDIndex == -999 ? 0 : lastSIDIndex + 2; i < max; i = i + 1) {
if (me.store1[i].getChild("ident").getValue() == "TOC" or me.store1[i].getChild("ident").getValue() == "TOD") { continue; }
var coord = geo.Coord.new();
coord.set_latlon(me.store1[i].getChild("pos_lat").getValue(), me.store1[i].getChild("pos_long").getValue());
var fixes = findFixesByID(coord, me.store1[i].getChild("ident").getValue());
var navaids = findNavaidsByID(coord, me.store1[i].getChild("ident").getValue());
if (size(fixes) > 0) {
fmgc.flightPlanController.flightplans[3].appendWP(createWPFrom(fixes[0]));
} else if (size(navaids) > 0) {
fmgc.flightPlanController.flightplans[3].appendWP(createWPFrom(navaids[0]));
} else {
var WP = createWP(coord, me.store1[i].getChild("ident").getValue());
fmgc.flightPlanController.flightplans[3].appendWP(WP);
}
}
fmgc.flightPlanController.flightplans[3].sid = fmgc.flightPlanController.flightplans[3].departure.getSid(SIDID);
fmgc.flightPlanController.flightplans[3].star = fmgc.flightPlanController.flightplans[3].destination.getStar(STARID);
}
fmgc.flightPlanController.destroyTemporaryFlightPlan(3, 1);
fmgc.windController.updatePlans();
fmgc.updateRouteManagerAlt();
fmgc.FMGCInternal.tripWindValue = abs(windComp);
# INITB
me.store1 = me.OFP.getChild("fuel");
me.store2 = me.OFP.getChild("weights");
if (units == "lbs") {
if (me.OFP.getNode("params/units").getValue() == "lbs") {
fmgc.FMGCInternal.taxiFuel = me.store1.getChild("taxi").getValue() / 1000;
fmgc.FMGCInternal.taxiFuelSet = 1;
fmgc.FMGCInternal.altFuel = me.store1.getChild("alternate_burn").getValue() / 1000;
@ -206,5 +274,7 @@ var SimbriefParser = {
fmgc.FMGCInternal.blockCalculating = 0;
fmgc.blockCalculating.setValue(0);
fmgc.FMGCInternal.blockConfirmed = 1;
return 1;
},
};

View file

@ -173,6 +173,7 @@ var MessageController = {
TypeIMessage.new("USING COST INDEX N", 1),TypeIMessage.new("WAIT FOR SYSTEM RESPONSE"),TypeIMessage.new("RWY/LS MISMATCH"),
TypeIMessage.new("VHF3 VOICE MSG NOT GEN"),TypeIMessage.new("NO COMM MSG NOT GEN"),TypeIMessage.new("WX UPLINK"),
TypeIMessage.new("SIMBRIEF DOWNLOAD FAILED"),TypeIMessage.new("MISSING USERNAME"),TypeIMessage.new("AOC ACT F-PLN UPLINK"),
TypeIMessage.new("NO ANSWER TO REQUEST"),TypeIMessage.new("NO D-ATIS AVAILABLE"),TypeIMessage.new("BAD SERVER RESPONSE")
]),
typeIIMessages: std.Vector.new([
TypeIIMessage.new("LAT DISCONT AHEAD", "amb", 0),TypeIIMessage.new("MORE DRAG"),TypeIIMessage.new("RWY/LS MISMATCH", "amb", 0),TypeIIMessage.new("STEP DELETED"),

View file

@ -387,7 +387,7 @@ controls.stepSpoilers = func(step) {
}
var deploySpeedbrake = func {
if (pts.Gear.Wow[1].getBoolValue() or pts.Gear.Wow[2].getBoolValue()) {
if (pts.Gear.wow[1].getBoolValue() or pts.Gear.wow[2].getBoolValue()) {
if (pts.Controls.Flight.speedbrake.getValue() < 1.0) {
pts.Controls.Flight.speedbrake.setValue(1.0);
}
@ -401,7 +401,7 @@ var deploySpeedbrake = func {
}
var retractSpeedbrake = func {
if (pts.Gear.Wow[1].getBoolValue() or pts.Gear.Wow[2].getBoolValue()) {
if (pts.Gear.wow[1].getBoolValue() or pts.Gear.wow[2].getBoolValue()) {
if (pts.Controls.Flight.speedbrake.getValue() > 0.0) {
pts.Controls.Flight.speedbrake.setValue(0.0);
}

111
Nasal/MCDU/ATIS.nas Normal file
View file

@ -0,0 +1,111 @@
var atisPage = {
title: nil,
fontMatrix: [[0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0]],
arrowsMatrix: [[0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0]],
arrowsColour: [["ack", "ack", "ack", "ack", "ack", "ack"],["ack", "ack", "ack", "ack", "ack", "ack"]],
L1: [nil, nil, "ack"], # content, title, colour
L2: [nil, nil, "ack"],
L3: [nil, nil, "ack"],
L4: [nil, nil, "ack"],
L5: [nil, nil, "ack"],
L6: [nil, nil, "ack"],
C1: [nil, nil, "ack"],
C2: [nil, nil, "ack"],
C3: [nil, nil, "ack"],
C4: [nil, nil, "ack"],
C5: [nil, nil, "ack"],
C6: [nil, nil, "ack"],
R1: [nil, nil, "ack"],
R2: [nil, nil, "ack"],
R3: [nil, nil, "ack"],
R4: [nil, nil, "ack"],
R5: [nil, nil, "ack"],
R6: [nil, nil, "ack"],
computer: nil,
size: 0,
new: func(computer, index) {
var ap = {parents:[atisPage]};
ap.computer = computer;
ap.page = 1;
ap.index = index;
ap.message = atsu.ATISInstances[index].lastATIS;
ap._setupPageWithData();
ap._numPages = 1;
ap.update();
return ap;
},
del: func() {
return nil;
},
getNumPages: func() {
me._numPages = math.ceil(size(me.message) / 210);
return me._numPages;
},
scrollUp: func() {
me.page -= 1;
if (me.page < 1) {
me.page = me.getNumPages();
}
me.update();
},
scrollDown: func() {
me.page += 1;
if (me.page > me.getNumPages()) {
me.page = 1;
}
me.update();
},
_clearPage: func() {
me.L2 = [nil, nil, "wht"];
me.L3 = [nil, nil, "wht"];
me.L4 = [nil, nil, "wht"];
me.C1 = [nil, nil, "ack"];
me.C2 = [nil, nil, "ack"];
me.C3 = [nil, nil, "ack"];
me.C4 = [nil, nil, "ack"];
me.C5 = [nil, nil, "ack"];
me.R2 = [nil, nil, "ack"];
me.R3 = [nil, nil, "ack"];
me.R4 = [nil, nil, "ack"];
me.R5 = [nil, nil, "ack"];
me.arrowsMatrix = [[0, 0, 0, 0, 1, 1], [0, 0, 0, 0, 0, 0]];
},
_setupPageWithData: func() {
me.title = atsu.ATISInstances[me.index].station ~ "/" ~ (atsu.ATISInstances[me.index].type == 0 ? "ARR" : "DEP") ~ " ATIS ";
me.L5 = [" PREV ATIS", nil, "wht"];
me.L6 = [" RETURN", " ATIS MENU", "wht"];
me.R6 = ["PRINT ", nil, "blu"];
me.arrowsMatrix = [[0, 0, 0, 0, 1, 1], [0, 0, 0, 0, 0, 1]];
me.arrowsColour = [["ack", "ack", "ack", "ack", "wht", "wht"], ["ack", "ack", "ack", "ack", "ack", "blu"]];
me.fontMatrix = [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]];
canvas_mcdu.pageSwitch[me.computer].setBoolValue(0);
},
update: func() {
me._clearPage();
var message = atsu.ATISInstances[me.index].lastATIS;
var pageMinusOne = (me.page - 1);
var numberExtraChar = pageMinusOne * 210;
me.L1 = [substr(message, numberExtraChar, 30), atsu.ATISInstances[me.index].station ~ "/" ~ (atsu.ATISInstances[me.index].type == 0 ? "ARR" : "DEP"), "wht"];
me.R1 = [" ",atsu.DictionaryString.fetchString1(atsu.ATISInstances[me.index].receivedCode).string2 ~ " " ~ atsu.ATISInstances[me.index].receivedTime ~ "Z", "wht"];
if (size(message) > 30) {
me.L2[1] = substr(message, numberExtraChar + 30, 30);
}
if (size(message) > 60) {
me.L2[0] = substr(message, numberExtraChar + 60, 30);
}
if (size(message) > 90) {
me.L3[1] = substr(message, numberExtraChar + 90, 30);
}
if (size(message) > 120) {
me.L3[0] = substr(message, numberExtraChar + 120, 30);
}
if (size(message) > 150) {
me.L4[1] = substr(message, numberExtraChar + 150, 30);
}
if (size(message) > 180) {
me.L4[0] = substr(message, numberExtraChar + 180, 30);
}
canvas_mcdu.pageSwitch[me.computer].setBoolValue(0);
},
};

View file

@ -27,6 +27,7 @@ var initInputA = func(key, i) {
if (tfs == 4) {
fmgc.FMGCInternal.altAirport = scratchpad;
fmgc.FMGCInternal.altAirportSet = 1;
atsu.ATISInstances[2].newStation(scratchpad);
fmgc.windController.updatePlans();
if (fmgc.FMGCInternal.blockConfirmed) {
fmgc.FMGCInternal.fuelCalculating = 0;
@ -219,6 +220,8 @@ var initInputA = func(key, i) {
}
fmgc.FMGCInternal.depApt = fromto[0];
fmgc.FMGCInternal.arrApt = fromto[1];
atsu.ATISInstances[0].newStation(fromto[0]);
atsu.ATISInstances[1].newStation(fromto[1]);
fmgc.FMGCInternal.toFromSet = 1;
fmgc.FMGCNodes.toFromSet.setValue(1);
#scratchpad

View file

@ -5,6 +5,7 @@
var pageNode = [props.globals.getNode("/MCDU[0]/page"), props.globals.getNode("/MCDU[1]/page")];
var page = nil;
var msg = nil;
var scratchpadNode = [nil, nil];
var MCDU_init = func(i) {
@ -285,6 +286,74 @@ var lskbutton = func(btn, i) {
pageNode[i].setValue("WEATHERREQ");
} else if (page == "RECEIVEDMSGS") {
canvas_mcdu.myReceivedMessages[i].leftKey(1);
} else if (page == "ATIS") {
var scratchpad = mcdu_scratchpad.scratchpads[i].scratchpad;
if (scratchpad == "CLR") {
if (atsu.ATISInstances[0].sent != 1) {
if (fmgc.FMGCInternal.depApt != "") {
atsu.ATISInstances[0].newStation(fmgc.FMGCInternal.depApt);
} else {
atsu.ATISInstances[0].station = nil;
}
mcdu_scratchpad.scratchpads[i].empty();
} else {
mcdu_message(i, "NOT ALLOWED");
}
} elsif (size(scratchpad) == 0) {
if (atsu.ATISInstances[0].received) {
canvas_mcdu.myAtis[i] = atisPage.new(i, 0);
pageNode[i].setValue("ATISDETAIL");
} else {
mcdu_message(i, "NOT ALLOWED");
}
} elsif (find("/", scratchpad) != -1) {
var str = split("/", scratchpad);
if (size(str[0]) > 0 and size(str[1]) == 0) {
var result = atsu.ATISInstances[0].newStation(str[0]);
if (result == 2) {
mcdu_message(i, "NOT IN DATA BASE");
} elsif (result == 1) {
mcdu_message(i, "NOT ALLOWED");
} elsif (result == 0) {
mcdu_scratchpad.scratchpads[i].empty();
}
} elsif (size(str[0]) == 0 and size(str[1]) > 0) {
if (str[1] == "DEP") {
atsu.ATISInstances[0].type = 1;
} elsif (str[1] == "ARR") {
atsu.ATISInstances[0].type = 0;
} else {
mcdu_message(i, "NOT ALLOWED");
}
mcdu_scratchpad.scratchpads[i].empty();
} elsif (size(str[0]) > 0 and size(str[1]) > 0) {
var result = atsu.ATISInstances[0].newStation(str[0]);
if (result == 2) {
mcdu_message(i, "NOT IN DATA BASE");
} elsif (result == 1) {
mcdu_message(i, "NOT ALLOWED");
}
if (str[1] == "DEP") {
atsu.ATISInstances[0].type = 1;
} elsif (str[1] == "ARR") {
atsu.ATISInstances[0].type = 0;
} else {
mcdu_message(i, "NOT ALLOWED");
}
mcdu_scratchpad.scratchpads[i].empty();
} else {
mcdu_message(i, "NOT ALLOWED");
}
} else {
var result = atsu.ATISInstances[0].newStation(scratchpad);
if (result == 2) {
mcdu_message(i, "NOT IN DATA BASE");
} elsif (result == 1) {
mcdu_message(i, "NOT ALLOWED");
} elsif (result == 0) {
mcdu_scratchpad.scratchpads[i].empty();
}
}
} else {
mcdu_message(i, "NOT ALLOWED");
}
@ -356,7 +425,76 @@ var lskbutton = func(btn, i) {
} else if (page == "RECEIVEDMSGS") {
canvas_mcdu.myReceivedMessages[i].leftKey(2);
} else if (page == "DATAMODE") {
atsu.ATIS.server = 0;
atsu.ATIS.serverSel.setValue("faa");
acconfig.writeSettings();
} else if (page == "ATIS") {
var scratchpad = mcdu_scratchpad.scratchpads[i].scratchpad;
if (scratchpad == "CLR") {
if (atsu.ATISInstances[1].sent != 1) {
if (fmgc.FMGCInternal.arrApt != "") {
atsu.ATISInstances[1].newStation(fmgc.FMGCInternal.arrApt);
} else {
atsu.ATISInstances[1].station = nil;
}
mcdu_scratchpad.scratchpads[i].empty();
} else {
mcdu_message(i, "NOT ALLOWED");
}
} elsif (size(scratchpad) == 0) {
if (atsu.ATISInstances[1].received) {
canvas_mcdu.myAtis[i] = atisPage.new(i, 1);
pageNode[i].setValue("ATISDETAIL");
} else {
mcdu_message(i, "NOT ALLOWED");
}
} elsif (find("/", scratchpad) != -1) {
var str = split("/", scratchpad);
if (size(str[0]) > 0 and size(str[1]) == 0) {
var result = atsu.ATISInstances[1].newStation(str[0]);
if (result == 2) {
mcdu_message(i, "NOT IN DATA BASE");
} elsif (result == 1) {
mcdu_message(i, "NOT ALLOWED");
} elsif (result == 0) {
mcdu_scratchpad.scratchpads[i].empty();
}
} elsif (size(str[0]) == 0 and size(str[1]) > 0) {
if (str[1] == "DEP") {
atsu.ATISInstances[1].type = 1;
} elsif (str[1] == "ARR") {
atsu.ATISInstances[1].type = 0;
} else {
mcdu_message(i, "NOT ALLOWED");
}
mcdu_scratchpad.scratchpads[i].empty();
} elsif (size(str[0]) > 0 and size(str[1]) > 0) {
var result = atsu.ATISInstances[1].newStation(str[0]);
if (result == 2) {
mcdu_message(i, "NOT IN DATA BASE");
} elsif (result == 1) {
mcdu_message(i, "NOT ALLOWED");
}
if (str[1] == "DEP") {
atsu.ATISInstances[1].type = 1;
} elsif (str[1] == "ARR") {
atsu.ATISInstances[1].type = 0;
} else {
mcdu_message(i, "NOT ALLOWED");
}
mcdu_scratchpad.scratchpads[i].empty();
} else {
mcdu_message(i, "NOT ALLOWED");
}
} else {
var result = atsu.ATISInstances[1].newStation(scratchpad);
if (result == 2) {
mcdu_message(i, "NOT IN DATA BASE");
} elsif (result == 1) {
mcdu_message(i, "NOT ALLOWED");
} elsif (result == 0) {
mcdu_scratchpad.scratchpads[i].empty();
}
}
} else {
mcdu_message(i, "NOT ALLOWED");
}
@ -411,7 +549,76 @@ var lskbutton = func(btn, i) {
} else if (page == "RECEIVEDMSGS") {
canvas_mcdu.myReceivedMessages[i].leftKey(3);
} else if (page == "DATAMODE") {
atsu.ATIS.server = 1;
atsu.ATIS.serverSel.setValue("vatsim");
acconfig.writeSettings();
} else if (page == "ATIS") {
var scratchpad = mcdu_scratchpad.scratchpads[i].scratchpad;
if (scratchpad == "CLR") {
if (atsu.ATISInstances[2].sent != 1) {
if (fmgc.FMGCInternal.altAirportSet) {
atsu.ATISInstances[2].newStation(fmgc.FMGCInternal.altAirport);
} else {
atsu.ATISInstances[2].station = nil;
}
mcdu_scratchpad.scratchpads[i].empty();
} else {
mcdu_message(i, "NOT ALLOWED");
}
} elsif (size(scratchpad) == 0) {
if (atsu.ATISInstances[2].received) {
canvas_mcdu.myAtis[i] = atisPage.new(i, 2);
pageNode[i].setValue("ATISDETAIL");
} else {
mcdu_message(i, "NOT ALLOWED");
}
} elsif (find("/", scratchpad) != -1) {
var str = split("/", scratchpad);
if (size(str[0]) > 0 and size(str[1]) == 0) {
var result = atsu.ATISInstances[2].newStation(str[0]);
if (result == 2) {
mcdu_message(i, "NOT IN DATA BASE");
} elsif (result == 1) {
mcdu_message(i, "NOT ALLOWED");
} elsif (result == 0) {
mcdu_scratchpad.scratchpads[i].empty();
}
} elsif (size(str[0]) == 0 and size(str[1]) > 0) {
if (str[1] == "DEP") {
atsu.ATISInstances[2].type = 1;
} elsif (str[1] == "ARR") {
atsu.ATISInstances[2].type = 0;
} else {
mcdu_message(i, "NOT ALLOWED");
}
mcdu_scratchpad.scratchpads[i].empty();
} elsif (size(str[0]) > 0 and size(str[1]) > 0) {
var result = atsu.ATISInstances[2].newStation(str[0]);
if (result == 2) {
mcdu_message(i, "NOT IN DATA BASE");
} elsif (result == 1) {
mcdu_message(i, "NOT ALLOWED");
}
if (str[1] == "DEP") {
atsu.ATISInstances[2].type = 1;
} elsif (str[1] == "ARR") {
atsu.ATISInstances[2].type = 0;
} else {
mcdu_message(i, "NOT ALLOWED");
}
mcdu_scratchpad.scratchpads[i].empty();
} else {
mcdu_message(i, "NOT ALLOWED");
}
} else {
var result = atsu.ATISInstances[2].newStation(scratchpad);
if (result == 2) {
mcdu_message(i, "NOT IN DATA BASE");
} elsif (result == 1) {
mcdu_message(i, "NOT ALLOWED");
} elsif (result == 0) {
mcdu_scratchpad.scratchpads[i].empty();
}
}
} else {
mcdu_message(i, "NOT ALLOWED");
}
@ -460,6 +667,70 @@ var lskbutton = func(btn, i) {
}
} else if (page == "RECEIVEDMSGS") {
canvas_mcdu.myReceivedMessages[i].leftKey(4);
} else if (page == "ATIS") {
var scratchpad = mcdu_scratchpad.scratchpads[i].scratchpad;
if (scratchpad == "CLR") {
if (atsu.ATISInstances[3].sent != 1) {
atsu.ATISInstances[3].station = nil;
mcdu_scratchpad.scratchpads[i].empty();
} else {
mcdu_message(i, "NOT ALLOWED");
}
} elsif (size(scratchpad) == 0) {
if (atsu.ATISInstances[3].received) {
canvas_mcdu.myAtis[i] = atisPage.new(i, 3);
pageNode[i].setValue("ATISDETAIL");
} else {
mcdu_message(i, "NOT ALLOWED");
}
} elsif (find("/", scratchpad) != -1) {
var str = split("/", scratchpad);
if (size(str[0]) > 0 and size(str[1]) == 0) {
var result = atsu.ATISInstances[3].newStation(str[0]);
if (result == 2) {
mcdu_message(i, "NOT IN DATA BASE");
} elsif (result == 1) {
mcdu_message(i, "NOT ALLOWED");
} elsif (result == 0) {
mcdu_scratchpad.scratchpads[i].empty();
}
} elsif (size(str[0]) == 0 and size(str[1]) > 0) {
if (str[1] == "DEP") {
atsu.ATISInstances[3].type = 1;
} elsif (str[1] == "ARR") {
atsu.ATISInstances[3].type = 0;
} else {
mcdu_message(i, "NOT ALLOWED");
}
mcdu_scratchpad.scratchpads[i].empty();
} elsif (size(str[0]) > 0 and size(str[1]) > 0) {
var result = atsu.ATISInstances[3].newStation(str[0]);
if (result == 2) {
mcdu_message(i, "NOT IN DATA BASE");
} elsif (result == 1) {
mcdu_message(i, "NOT ALLOWED");
}
if (str[1] == "DEP") {
atsu.ATISInstances[3].type = 1;
} elsif (str[1] == "ARR") {
atsu.ATISInstances[3].type = 0;
} else {
mcdu_message(i, "NOT ALLOWED");
}
mcdu_scratchpad.scratchpads[i].empty();
} else {
mcdu_message(i, "NOT ALLOWED");
}
} else {
var result = atsu.ATISInstances[3].newStation(scratchpad);
if (result == 2) {
mcdu_message(i, "NOT IN DATA BASE");
} elsif (result == 1) {
mcdu_message(i, "NOT ALLOWED");
} elsif (result == 0) {
mcdu_scratchpad.scratchpads[i].empty();
}
}
} else {
mcdu_message(i, "NOT ALLOWED");
}
@ -585,6 +856,12 @@ var lskbutton = func(btn, i) {
pageNode[i].setValue("ATSUDLINK");
} else if (page == "COMMINIT" or page == "VOICEDIRECTORY" or page == "DATAMODE" or page == "COMMSTATUS" or page == "COMPANYCALL") {
pageNode[i].setValue("COMMMENU");
} else if (page == "ATIS") {
pageNode[i].setValue("ATCMENU2");
} else if (page == "ATISDETAIL") {
pageNode[i].setValue("ATIS");
} else if (page == "AOCCONFIG") {
pageNode[i].setValue("AOCMENU");
} else {
mcdu_message(i, "NOT ALLOWED");
}
@ -666,6 +943,14 @@ var rskbutton = func(btn, i) {
} else if (page == "WEATHERTYPE") {
atsu.AOC.selectedType = "TERM FCST";
pageNode[i].setValue("WEATHERREQ");
} else if (page == "ATCMENU2") {
pageNode[i].setValue("ATIS");
} else if (page == "ATIS") {
if (atsu.ATISInstances[0].station != nil and atsu.ATISInstances[0].sent != 1) {
atsu.ATISInstances[0].sendReq(i);
} else {
mcdu_message(i, "NOT ALLOWED");
}
} else {
mcdu_message(i, "NOT ALLOWED");
}
@ -698,7 +983,14 @@ var rskbutton = func(btn, i) {
} else if (page == "AOCMENU") {
pageNode[i].setValue("WEATHERREQ");
} else if (page == "DATAMODE") {
atsu.AOC.server = 0;
atsu.AOC.server.setValue("noaa");
acconfig.writeSettings();
} else if (page == "ATIS") {
if (atsu.ATISInstances[1].station != nil and atsu.ATISInstances[1].sent != 1) {
atsu.ATISInstances[1].sendReq(i);
} else {
mcdu_message(i, "NOT ALLOWED");
}
} else {
mcdu_message(i, "NOT ALLOWED");
}
@ -737,7 +1029,14 @@ var rskbutton = func(btn, i) {
canvas_mcdu.myReceivedMessages[i] = receivedMessagesPage.new(i);
pageNode[i].setValue("RECEIVEDMSGS");
} else if (page == "DATAMODE") {
atsu.AOC.server = 1;
atsu.AOC.server.setValue("vatsim");
acconfig.writeSettings();
} else if (page == "ATIS") {
if (atsu.ATISInstances[2].station != nil and atsu.ATISInstances[2].sent != 1) {
atsu.ATISInstances[2].sendReq(i);
} else {
mcdu_message(i, "NOT ALLOWED");
}
} else {
mcdu_message(i, "NOT ALLOWED");
}
@ -798,6 +1097,12 @@ var rskbutton = func(btn, i) {
canvas_mcdu.myArrival[i].arrPushbuttonRight(4);
} else if (page == "F-PLNA" or page == "F-PLNB") {
canvas_mcdu.myFpln[i].pushButtonRight(4);
} else if (page == "ATIS") {
if (atsu.ATISInstances[3].station != nil and atsu.ATISInstances[3].sent != 1) {
atsu.ATISInstances[3].sendReq(i);
} else {
mcdu_message(i, "NOT ALLOWED");
}
} else {
mcdu_message(i, "NOT ALLOWED");
}
@ -884,7 +1189,7 @@ var rskbutton = func(btn, i) {
} elsif (result == 4) {
mcdu.mcdu_message(i, "NO COMM MSG NOT GEN");
} else {
mcdu_scratchpad.scratchpads[i].empty();
pageNode[i].setValue("AOCMENU");
}
} else if (page == "VOICEDIRECTORY") {
for (var i = 0; i < 3; i = i + 1) {
@ -892,6 +1197,8 @@ var rskbutton = func(btn, i) {
rmp.transfer(i + 1);
}
}
} else if (page == "AOCMENU") {
pageNode[i].setValue("AOCCONFIG");
} else {
mcdu_message(i, "NOT ALLOWED");
}
@ -944,6 +1251,13 @@ var rskbutton = func(btn, i) {
pageNode[i].setValue("COMMMENU");
} else if (page == "CONNECTSTATUS") {
pageNode[i].setValue("NOTIFICATION");
} else if (page == "AOCMENU") {
msg = mcdu.ReceivedMessagesDatabase.firstUnviewed();
if (msg != -99) {
canvas_mcdu.myReceivedMessages[i] = receivedMessagesPage.new(i);
canvas_mcdu.myReceivedMessage[i] = receivedMessagePage.new(i, msg);
pageNode[i].setValue("RECEIVEDMSG");
}
} else {
mcdu_message(i, "NOT ALLOWED");
}
@ -1029,6 +1343,8 @@ var arrowbutton = func(btn, i) {
initInputIRS("up",i);
} else if (page == "WINDCRZ") {
canvas_mcdu.myCRZWIND[i].pushButtonUp();
} else if (page == "ATISDETAIL") {
canvas_mcdu.myAtis[i].scrollUp();
}
} else if (btn == "down") {
if (page == "F-PLNA" or page == "F-PLNB") {
@ -1043,6 +1359,8 @@ var arrowbutton = func(btn, i) {
initInputIRS("down",i);
} else if (page == "WINDCRZ") {
canvas_mcdu.myCRZWIND[i].pushButtonDown();
} else if (page == "ATISDETAIL") {
canvas_mcdu.myAtis[i].scrollDown();
}
}
}
@ -1088,7 +1406,7 @@ var pagebutton = func(btn, i) {
pageNode[i].setValue("DATA");
} else if (btn == "mcdu") {
var page = page;
if (page != "ATSUDLINK" and page != "AOCMENU" and page != "WEATHERREQ" and page != "WEATHERTYPE" and page != "RECEIVEDMSGS" and page != "RECEIVEDMSG" and page != "ATCMENU" and page != "ATCMENU2" and page != "NOTIFICATION" and page != "CONNECTSTATUS" and page != "COMPANYCALL" and page != "VOICEDIRECTORY" and page != "DATAMODE" and page != "COMMMENU" and page != "COMMSTATUS" and page != "COMMINIT") {
if (page != "ATSUDLINK" and page != "AOCMENU" and page != "AOCCONFIG" and page != "WEATHERREQ" and page != "WEATHERTYPE" and page != "RECEIVEDMSGS" and page != "RECEIVEDMSG" and page != "ATCMENU" and page != "ATCMENU2" and page != "NOTIFICATION" and page != "CONNECTSTATUS" and page != "COMPANYCALL" and page != "VOICEDIRECTORY" and page != "DATAMODE" and page != "COMMMENU" and page != "COMMSTATUS" and page != "COMMINIT" and page != "ATIS" and page != "ATISDETAIL") {
setprop("/MCDU[" ~ i ~ "]/last-fmgc-page", page);
} else {
setprop("/MCDU[" ~ i ~ "]/last-atsu-page", page);

View file

@ -73,7 +73,7 @@ var receivedMessagesPage = {
if (me.size >= (me.curPage * 5) + -4) {
message = ReceivedMessagesDatabase.database.vector[-5 + (me.curPage * 5)];
me.L1[0] = " " ~ left(message.body, 23);
me.L1[0] = " " ~ left(message.body, size(message.body) > 23 ? 23 : size(message.body));
me.L1[2] = "blu";
if (!message.viewed) {
me.L1[1] = " " ~ message.time ~ " NEW";
@ -85,7 +85,7 @@ var receivedMessagesPage = {
if (me.size >= (me.curPage * 5) + -3) {
message = ReceivedMessagesDatabase.database.vector[-4 + (me.curPage * 5)];
me.L2[0] = " " ~ left(message.body, 23);
me.L2[0] = " " ~ left(message.body, size(message.body) > 23 ? 23 : size(message.body));
me.L2[2] = "blu";
if (!message.viewed) {
me.L2[1] = " " ~ message.time ~ " NEW";
@ -97,7 +97,7 @@ var receivedMessagesPage = {
if (me.size >= (me.curPage * 5) + -2) {
message = ReceivedMessagesDatabase.database.vector[-3 + (me.curPage * 5)];
me.L3[0] = " " ~ left(message.body, 23);
me.L3[0] = " " ~ left(message.body, size(message.body) > 23 ? 23 : size(message.body));
me.L3[2] = "blu";
if (!message.viewed) {
me.L3[1] = " " ~ message.time ~ " NEW";
@ -109,7 +109,7 @@ var receivedMessagesPage = {
if (me.size >= (me.curPage * 5) + -1) {
message = ReceivedMessagesDatabase.database.vector[-2 + (me.curPage * 5)];
me.L4[0] = " " ~ left(message.body, 23);
me.L4[0] = " " ~ left(message.body, size(message.body) > 23 ? 23 : size(message.body));
me.L4[2] = "blu";
if (!message.viewed) {
me.L4[1] = " " ~ message.time ~ " NEW";
@ -121,7 +121,7 @@ var receivedMessagesPage = {
if (me.size >= (me.curPage * 5) + 0) {
message = ReceivedMessagesDatabase.database.vector[-1 + (me.curPage * 5)];
me.L5[0] = " " ~ left(message.body, 23);
me.L5[0] = " " ~ left(message.body, size(message.body) > 23 ? 23 : size(message.body));
me.L5[2] = "blu";
if (!message.viewed) {
me.L5[1] = " " ~ message.time ~ " NEW";
@ -134,11 +134,22 @@ var receivedMessagesPage = {
},
leftKey: func(index) {
if (ReceivedMessagesDatabase.getSize() >= (-5 + index + (me.curPage * 5))) {
if (mcdu_scratchpad.scratchpads[me.computer].scratchpad == "CLR") {
ReceivedMessagesDatabase.removeAtIndex(-6 + index + (me.curPage * 5));
me.update();
if (ReceivedMessagesDatabase.getSize() < (me.curPage * 5) and ReceivedMessagesDatabase.getSize() >= 5) {
me.scrollLeft();
}
mcdu_scratchpad.scratchpads[me.computer].empty();
} elsif (size(mcdu_scratchpad.scratchpads[me.computer].scratchpad) == 0) {
canvas_mcdu.myReceivedMessage[me.computer] = receivedMessagePage.new(me.computer, (-6 + index + (me.curPage * 5)));
setprop("MCDU[" ~ me.computer ~ "]/page", "RECEIVEDMSG");
} else {
mcdu_message(me.computer, "NOT ALLOWED");
}
} else {
mcdu_message(me.computer, "NOT ALLOWED");
}
},
};
@ -288,12 +299,23 @@ var ReceivedMessagesDatabase = {
canvas_mcdu.myReceivedMessages[1].update();
}
},
firstUnviewed: func() {
for (var i = 0; i < me.getSize(); i = i + 1) {
if (!me.database.vector[i].viewed) {
return i;
}
}
return -99;
},
getCountPages: func() {
return math.ceil(me.database.size() / 5);
return math.ceil(me.getSize() / 5);
},
getSize: func() {
return me.database.size();
},
removeAtIndex: func(index) {
return me.database.pop(index);
},
clearDatabase: func() {
me.database.clear();
},

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

@ -2,41 +2,6 @@
# Jonathan Redpath
# Copyright (c) 2020 Josh Davidson (Octal450)
var DictionaryItem = {
new: func(item, string) {
var DI = {parents: [DictionaryItem]};
DI.item = item;
DI.string = string;
return DI;
},
};
var Dictionary = {
database: std.Vector.new(),
addToDatabase: func(dictItem) {
me.database.append(dictItem);
},
fetchString: func(string) {
foreach (var item; me.database.vector) {
if (me.item.string == string) {
return item;
}
}
},
fetchItem: func(itemObj) {
foreach (var item; me.database.vector) {
if (item.item == itemObj) {
return item;
}
}
},
};
makeNewDictionaryItem = func(item, string) {
var dictItem = DictionaryItem.new(item, string);
Dictionary.addToDatabase(dictItem);
};
var CPDLCmessage = {
new: func(text) {
var cpdlcMessage = {parents: [CPDLCmessage] };

View file

@ -0,0 +1,75 @@
# A3XX Dictionary
# Jonathan Redpath
# Copyright (c) 2020 Josh Davidson (Octal450)
var DictionaryItemObj = {
new: func(item, string) {
var DI = {parents: [DictionaryItemObj]};
DI.item = item;
DI.string = string;
return DI;
},
};
var DictionaryObj = {
database: std.Vector.new(),
addToDatabase: func(dictItem) {
me.database.append(dictItem);
},
fetchString: func(string) {
foreach (var item; me.database.vector) {
if (me.item.string == string) {
return item;
}
}
},
fetchItem: func(itemObj) {
foreach (var item; me.database.vector) {
if (item.item == itemObj) {
return item;
}
}
},
};
var makeNewDictionaryItem = func(item, string) {
var dictItem = DictionaryItemObj.new(item, string);
DictionaryObj.addToDatabase(dictItem);
};
var DictionaryItemString = {
new: func(string1, string2) {
var DI = {parents: [DictionaryItemString]};
DI.string1 = string1;
DI.string2 = string2;
return DI;
},
};
var DictionaryString = {
database: std.Vector.new(),
addToDatabase: func(dictItem) {
me.database.append(dictItem);
},
fetchString1: func(stringSearch) {
foreach (var item; me.database.vector) {
if (string.uc(item.string1) == string.uc(stringSearch)) {
return item;
}
}
return "";
},
fetchString2: func(stringSearch) {
foreach (var item; me.database.vector) {
if (string.uc(item.string2) == string.uc(stringSearch)) {
return item;
}
}
return "";
},
};
var makeNewDictionaryString = func(string1, string2) {
var dictItem = DictionaryItemString.new(string1, string2);
DictionaryString.addToDatabase(dictItem);
};

View file

@ -3,7 +3,6 @@
# Copyright (c) 2020 Josh Davidson (Octal450)
var defaultServer = "https://www.aviationweather.gov/adds/dataserver_current/httpparam?dataSource=metars&requestType=retrieve&format=xml&mostRecent=true&hoursBeforeNow=12&stationString=";
var serverString = "";
var result = nil;
var ATSU = {
@ -104,15 +103,10 @@ var AOC = {
sentTime: nil,
received: 0,
receivedTime: nil,
server: 0, # 0 = noaa, 1 = vatsim
server: props.globals.getNode("/systems/atsu/wxr-server"),
newStation: func(airport) {
if (size(airport) == 3 or size(airport) == 4) {
if (size(findAirportsByICAO(airport)) == 0) {
return 2;
} else {
me.station = airport;
return 0;
}
} else {
return 1;
}
@ -123,9 +117,18 @@ var AOC = {
}
me.sent = 1;
me.received = 0;
var sentTime = left(getprop("/sim/time/gmt-string"), 5);
me.sentTime = split(":", sentTime)[0] ~ "." ~ split(":", sentTime)[1] ~ "Z";
if (size(findAirportsByICAO(me.station)) == 0) {
me.received = 1;
me.receivedTime = me.sentTime;
var message = mcdu.ACARSMessage.new(me.receivedTime, "INVALID STATION " ~ me.station);
mcdu.ReceivedMessagesDatabase.addMessage(message);
return 0;
}
if (me.selectedType == "HOURLY WX") {
var result = me.fetchMETAR(atsu.AOC.station, i);
if (result == 0) {
@ -148,8 +151,13 @@ var AOC = {
}
}
},
downloadFail: func(i, r = nil) {
mcdu.mcdu_message(i,"NO ANSWER TO REQUEST");
debug.dump("HTTP failure " ~ r.status);
me.sent = 0;
},
fetchMETAR: func(airport, i) {
if (!ATSU.working) {
if (!ATSU.working or !fmgc.FMGCInternal.flightNumSet) {
me.sent = 0;
return 2;
}
@ -158,23 +166,29 @@ var AOC = {
return 1;
}
serverString = "";
if (me.server == 0) {
serverString = defaultServer;
} elsif (me.server == 1) {
var serverString = "";
if (me.server.getValue() == "vatsim") {
serverString = "https://api.flybywiresim.com/metar?source=vatsim&icao=";
} else { # fall back to NOAA silently
} else {
serverString = defaultServer;
}
http.load(serverString ~ airport)
.fail(func(r) print("Download failed; try changing your server to NOAA"))
.done(func(r) me.processMETAR(r, i));
.fail(func(r) me.downloadFail(i, r))
.done(func(r) {
var errs = [];
call(me.processMETAR, [r, i], me, {}, errs);
if (size(errs) > 0) {
print("Failed to parse METAR for " ~ airport);
debug.dump(r.response);
debug.printerror(errs);
mcdu.mcdu_message(i, "BAD SERVER RESPONSE");
}
});
return 0;
},
fetchTAF: func(airport, i) {
if (!ATSU.working) {
if (!ATSU.working or !fmgc.FMGCInternal.flightNumSet) {
me.sent = 0;
return 2;
}
@ -183,15 +197,33 @@ var AOC = {
return 1;
}
http.load("https://www.aviationweather.gov/adds/dataserver_current/httpparam?dataSource=tafs&requestType=retrieve&format=xml&timeType=issue&mostRecent=true&hoursBeforeNow=12&stationString=" ~ airport)
.fail(func print("Download failed!"))
.done(func(r) me.processTAF(r, i));
.fail(func(r) me.downloadFail(i))
.done(func(r) {
var errs = [];
call(me.processTAF, [r, i], me, {}, errs);
if (size(errs) > 0) {
print("Failed to parse TAF for " ~ airport);
debug.dump(r.response);
debug.printerror(errs);
mcdu.mcdu_message(i, "BAD SERVER RESPONSE");
}
});
return 0;
},
processMETAR: func(r, i) {
var raw = r.response;
if (me.server.getValue() == "vatsim") {
me.lastMETAR = raw;
} else if (find("<raw_text>", raw) != -1) {
raw = split("<raw_text>", raw)[1];
raw = split("</raw_text>", raw)[0];
me.lastMETAR = raw;
} else {
me.received = 0;
me.sent = 0;
mcdu.mcdu_message(i, "BAD SERVER RESPONSE");
return;
}
settimer(func() {
me.received = 1;
mcdu.mcdu_message(i, "WX UPLINK");
@ -204,9 +236,17 @@ var AOC = {
},
processTAF: func(r, i) {
var raw = r.response;
if (find("<raw_text>", raw) != -1) {
raw = split("<raw_text>", raw)[1];
raw = split("</raw_text>", raw)[0];
me.lastTAF = raw;
} else {
me.received = 0;
me.sent = 0;
mcdu.mcdu_message(i, "BAD SERVER RESPONSE");
return;
}
me.lastTAF = raw;
settimer(func() {
me.received = 1;
mcdu.mcdu_message(i, "WX UPLINK");
@ -220,14 +260,21 @@ var AOC = {
};
var ATIS = {
station: nil,
lastATIS: nil,
sent: 0,
sentTime: nil,
received: 0,
receivedTime: nil,
server: 0,
serverSel: props.globals.getNode("/systems/atsu/atis-server"),
new: func() {
var ATIS = { parents: [ATIS] };
ATIS.station = nil;
ATIS.lastATIS = nil;
ATIS.sent = 0;
ATIS.received = 0;
ATIS.receivedTime = nil;
ATIS.receivedCode = nil;
ATIS.type = 0; # 0 = arr, 1 = dep
return ATIS;
},
newStation: func(airport) {
me.sent = 0;
me.received = 0;
if (size(airport) == 3 or size(airport) == 4) {
if (size(findAirportsByICAO(airport)) == 0) {
return 2;
@ -245,10 +292,8 @@ var ATIS = {
}
me.sent = 1;
me.received = 0;
var sentTime = left(getprop("/sim/time/gmt-string"), 5);
me.sentTime = split(":", sentTime)[0] ~ "." ~ split(":", sentTime)[1] ~ "Z";
result = me.fetchATIS(atsu.ATIS.station, i);
result = me.fetchATIS(me.station, i);
if (result == 0) {
return 0;
} elsif (result == 1) {
@ -267,39 +312,139 @@ var ATIS = {
return 1;
}
serverString = "";
if (me.server == 0) {
serverString = "https://api.flybywiresim.com/atis?source=faa&icao=";
} elsif (me.server == 1) {
serverString = "https://api.flybywiresim.com/atis?source=vatsim&icao=";
} else { # fall back to FAA silently
serverString = "https://api.flybywiresim.com/atis?source=faa&icao=";
}
var serverString = "https://api.flybywiresim.com/atis?source=" ~ me.serverSel.getValue() ~ "&icao=";
http.load(serverString ~ airport)
.fail(func(r) return 3)
.done(func(r) me.processATIS(r, i));
.done(func(r) {
var errs = [];
call(me.processATIS, [r, i], me, {}, errs);
if (size(errs) > 0) {
print("Failed to parse ATIS for " ~ airport);
debug.dump(r.response);
debug.printerror(errs);
mcdu.mcdu_message(i, "BAD SERVER RESPONSE");
}
});
return 0;
},
processATIS: func(r, i) {
var raw = r.response;
if (find("combined", raw)) {
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");
return;
}
if (find("combined", raw) != -1) {
raw = split('{"combined":"', raw)[1];
raw = split('"}', raw)[0];
} else {
if (me.type == 0) {
raw = split('{"arr":"', raw)[1];
raw = split('","dep":', raw)[0];
} else {
raw = split('","dep":"', raw)[1];
raw = split('"}', raw)[0];
}
}
me.lastATIS = raw;
settimer(func() {
me.received = 1;
mcdu.mcdu_message(i, "WX UPLINK");
var receivedTime = left(getprop("/sim/time/gmt-string"), 5);
me.receivedTime = split(":", receivedTime)[0] ~ "." ~ split(":", receivedTime)[1] ~ "Z";
var message = mcdu.ACARSMessage.new(me.receivedTime, me.lastATIS);
mcdu.ReceivedMessagesDatabase.addMessage(message);
}, math.max(rand()*10, 2.25));
var code = "";
if (find("INFO ", raw) != -1) {
code = split("INFO ", raw)[1];
code = split(" ", code)[0];
} else if (find("information ", raw) != -1) {
code = split("information ", raw)[1];
code = split(" ", code)[0];
} else if (find("INFORMATION ", raw) != -1) {
code = split("INFORMATION ", raw)[1];
code = split(" ", code)[0];
} else if (find("ATIS ", raw) != -1) {
code = split("ATIS ", raw)[1];
code = split(" ", code)[0];
} else if (find("info ", raw) != -1) {
code = split("info ", raw)[1];
code = split(" ", code)[0];
} else {
print("Failed to find a valid ATIS code for " ~ me.station);
debug.dump(raw);
}
if (find(".", code) != -1) {
code = split(".", code)[0];
}
me.receivedCode = code;
var time = "";
if (find("Time ", raw) != -1) {
time = split("Time ", raw)[1];
time = split(" ", time)[0];
} else if (find("time ", raw) != -1) {
time = split("time ", raw)[1];
time = split(" ", time)[0];
} else if (find("TIME ", raw) != -1) {
time = split("TIME ", raw)[1];
time = split(" ", time)[0];
} else if (find("Z.", raw) != -1) {
time = split("Z.", raw)[0];
time = right(time, 4);
} else if (find("Z SPECIAL", raw) != -1) {
time = split("Z SPECIAL", raw)[0];
time = right(time, 4);
} else if (find("metreport", raw) != -1) {
time = split("metreport", raw)[0];
time = right(time, 4);
} else if (find((code ~ " "), raw) != -1) {
if (size(split(" ",split(code ~ " ", raw)[1])[0]) == 4) {
time = split(" ",split(code ~ " ", raw)[1])[0];
}
} else {
print("Failed to find a valid ATIS time for " ~ me.station);
debug.dump(raw);
}
if (size(time) == 3) {
time ~= " ";
}
raw = string.uc(raw);
raw = string.replace(raw, ",", "");
settimer(func() {
me.sent = 0;
me.received = 1;
me.receivedTime = time;
me.lastATIS = raw;
}, math.max(rand()*10, 4.5));
},
};
makeNewDictionaryString("A", "ALPHA");
makeNewDictionaryString("B", "BRAVO");
makeNewDictionaryString("C", "CHARLIE");
makeNewDictionaryString("D", "DELTA");
makeNewDictionaryString("E", "ECHO");
makeNewDictionaryString("F", "FOXTROT");
makeNewDictionaryString("G", "GOLF");
makeNewDictionaryString("H", "HOTEL");
makeNewDictionaryString("I", "INDIA");
makeNewDictionaryString("J", "JULIET");
makeNewDictionaryString("K", "KILO");
makeNewDictionaryString("L", "LIMA");
makeNewDictionaryString("M", "MIKE");
makeNewDictionaryString("N", "NOVEMBER");
makeNewDictionaryString("O", "OSCAR");
makeNewDictionaryString("P", "PAPA");
makeNewDictionaryString("Q", "QUEBEC");
makeNewDictionaryString("R", "ROMEO");
makeNewDictionaryString("S", "SIERRA");
makeNewDictionaryString("T", "TANGO");
makeNewDictionaryString("U", "UNIFORM");
makeNewDictionaryString("V", "VICTOR");
makeNewDictionaryString("W", "WHISKEY");
makeNewDictionaryString("X", "XRAY");
makeNewDictionaryString("Y", "YANKEE");
makeNewDictionaryString("Z", "ZULU");
var ATISInstances = [ATIS.new(), ATIS.new(), ATIS.new(), ATIS.new()];

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

@ -772,6 +772,7 @@
<switch name="/systems/electrical/sources/idg-1/gcu-1-voltage-trip">
<default value="0"/>
<test logic="AND" value="1">
/systems/acconfig/autoconfig-running ne 1
/systems/electrical/sources/idg-1/gcu-1-voltage-trip eq 1
/controls/electrical/switches/gen-1 eq 1
</test>
@ -787,6 +788,7 @@
<switch name="/systems/electrical/sources/idg-1/gcu-1-frequency-trip">
<default value="0"/>
<test logic="AND" value="1">
/systems/acconfig/autoconfig-running ne 1
/systems/electrical/sources/idg-1/gcu-1-frequency-trip eq 1
/controls/electrical/switches/gen-1 eq 1
</test>
@ -845,6 +847,7 @@
<switch name="/systems/electrical/sources/idg-2/gcu-2-voltage-trip">
<default value="0"/>
<test logic="AND" value="1">
/systems/acconfig/autoconfig-running ne 1
/systems/electrical/sources/idg-2/gcu-2-voltage-trip eq 1
/controls/electrical/switches/gen-2 eq 1
</test>
@ -860,6 +863,7 @@
<switch name="/systems/electrical/sources/idg-2/gcu-2-frequency-trip">
<default value="0"/>
<test logic="AND" value="1">
/systems/acconfig/autoconfig-running ne 1
/systems/electrical/sources/idg-2/gcu-2-frequency-trip eq 1
/controls/electrical/switches/gen-2 eq 1
</test>
@ -934,6 +938,7 @@
<switch name="/systems/electrical/sources/apu/gcu-voltage-trip">
<default value="0"/>
<test logic="AND" value="1">
/systems/acconfig/autoconfig-running ne 1
/systems/electrical/sources/apu/gcu-voltage-trip eq 1
/controls/electrical/switches/apu eq 1
</test>
@ -949,6 +954,7 @@
<switch name="/systems/electrical/sources/apu/gcu-frequency-trip">
<default value="0"/>
<test logic="AND" value="1">
/systems/acconfig/autoconfig-running ne 1
/systems/electrical/sources/apu/gcu-frequency-trip eq 1
/controls/electrical/switches/apu eq 1
</test>
@ -1079,7 +1085,7 @@
<actuator name="/systems/electrical/relay/ac-ess-feed-1/auto-switch-timer">
<input>/systems/electrical/relay/ac-ess-feed-1/auto-switch</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.33333333333</rate_limit> <!-- 3 seconds -->
</actuator>
@ -1600,13 +1606,6 @@
</test>
</switch>
<switch name="/systems/electrical/relay/dc-ess-shed-switch/output">
<default value="0"/>
<test value="/systems/electrical/bus/dc-ess">
/systems/electrical/relay/dc-ess-shed-switch/contact-pos eq 1
</test>
</switch>
<!-- DC Service Bus -->
<switch name="/systems/electrical/relay/dc-svc-bus-contactor-tr/contact-pos"> <!-- TODO: via 1PX CB on 124VU -->
<default value="0"/>
@ -1806,7 +1805,7 @@
<pure_gain name="/systems/electrical/bus/dc-ess-shed">
<input>/systems/electrical/bus/dc-ess</input>
<gain>1</gain>
<gain>/systems/electrical/relay/dc-ess-shed-switch/contact-pos</gain>
</pure_gain>
<!-- Hot Buses -->
@ -1880,7 +1879,7 @@
<actuator name="/systems/electrical/some-electric-thingie/static-inverter-timer">
<input>/systems/electrical/relay/ac-ess-feed-inverter/contact-pos</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.1</rate_limit> <!-- 10 seconds -->
</actuator>

View file

@ -188,7 +188,7 @@
<actuator name="/systems/fuel/pumps/center-control-low-level">
<description>Timer for the Fuel Center pumps</description>
<input>/systems/fuel/quantity/center-low</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.00333</rate_limit> <!-- 300 seconds -->
</actuator>
@ -767,7 +767,9 @@
/consumables/fuel/tank[3]/level-norm lt 0.9999
</test>
</switch>
</channel>
<channel name="Final Flow Rates">
<summer name="/systems/fuel/internal/left-outer-flow-rate">
<input>/systems/fuel/internal/left-outer-wing-tank-refuel</input>
<input>-/systems/fuel/internal/left-wing-outer-to-inner-tank</input>

View file

@ -9,9 +9,22 @@
<actuator name="/ECAM/timer/ground-calc">
<description>Timer for the ECAM phase system</description>
<input>/ECAM/ground-calc-immediate</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<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,6 +93,142 @@
</test>
</switch>
<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
/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

@ -9,259 +9,252 @@
<actuator name="/ECAM/phases/timer/eng1idle-output">
<description>Timer for the ECAM system</description>
<input>/ECAM/phases/timer/eng1idle</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.033</rate_limit> <!-- 30 seconds -->
</actuator>
<actuator name="/ECAM/phases/timer/eng2idle-output">
<description>Timer for the ECAM system</description>
<input>/ECAM/phases/timer/eng2idle</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<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">100</rate_limit> <!-- Instant -->
<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>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.33</rate_limit> <!-- 3 seconds -->
</actuator>
<actuator name="/ECAM/phases/timer/ldg-inhibit-output">
<description>Timer for the ECAM system</description>
<input>/ECAM/phases/timer/ldg-inhibit</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.33</rate_limit> <!-- 3 seconds -->
</actuator>
<actuator name="/ECAM/warnings/timer/bleed-1-fault-output">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/timer/bleed-1-fault</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.2</rate_limit> <!-- 5 seconds -->
</actuator>
<actuator name="/ECAM/warnings/timer/bleed-2-fault-output">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/timer/bleed-2-fault</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.2</rate_limit> <!-- 5 seconds -->
</actuator>
<actuator name="/ECAM/warnings/timer/apu-fault-output">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/logic/apu-bleed-fault</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.1</rate_limit> <!-- 10 seconds -->
</actuator>
<actuator name="/ECAM/warnings/timer/xbleed-fault-output">
<description>Timer for the ECAM system</description>
<input>/systems/pneumatics/warnings/crossbleed-disag</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.1</rate_limit> <!-- 10 seconds -->
</actuator>
<actuator name="/ECAM/warnings/timer/prv-1-not-shut-apu-output">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/logic/prv-1-not-shut-apu</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">1</rate_limit> <!-- 1 second -->
</actuator>
<actuator name="/ECAM/warnings/timer/prv-2-not-shut-apu-output">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/logic/prv-2-not-shut-apu</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">1</rate_limit> <!-- 1 second -->
</actuator>
<actuator name="/ECAM/warnings/timer/prv-1-not-shut-output">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/logic/prv-1-not-shut</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">1</rate_limit> <!-- 1 second -->
</actuator>
<actuator name="/ECAM/warnings/timer/prv-2-not-shut-output">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/logic/prv-2-not-shut</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">1</rate_limit> <!-- 1 second -->
</actuator>
<actuator name="/ECAM/warnings/timer/bleed-1-and-2-low-temp-output">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/timer/bleed-1-and-2-low-temp</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.00185185</rate_limit> <!-- 540 seconds -->
</actuator>
<actuator name="/ECAM/warnings/timer/bleed-1-low-temp-output">
<description>Timer for the ECAM system</description>
<input>/systems/pneumatics/warnings/lowtemp-1-mem</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.016666</rate_limit> <!-- 60 seconds -->
</actuator>
<actuator name="/ECAM/warnings/timer/bleed-2-low-temp-output">
<description>Timer for the ECAM system</description>
<input>/systems/pneumatics/warnings/lowtemp-2-mem</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.016666</rate_limit> <!-- 60 seconds -->
</actuator>
<actuator name="/ECAM/warnings/logic/bleed-1-off-60-output">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/logic/bleed-1-off-60</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.016666</rate_limit> <!-- 60 seconds -->
</actuator>
<actuator name="/ECAM/warnings/logic/bleed-2-off-60-output">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/logic/bleed-2-off-60</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.016666</rate_limit> <!-- 60 seconds -->
</actuator>
<actuator name="/ECAM/warnings/logic/bleed-1-off-5-output">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/logic/bleed-1-off-5</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.2</rate_limit> <!-- 5 seconds -->
</actuator>
<actuator name="/ECAM/warnings/timer/bleed-2-off-5-output">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/logic/bleed-2-off-5</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.2</rate_limit> <!-- 5 seconds -->
</actuator>
<actuator name="/ECAM/warnings/timer/eng-aice-1-open-output">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/logic/eng-aice-1-open</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.2</rate_limit> <!-- 5 seconds -->
</actuator>
<actuator name="/ECAM/warnings/timer/eng-aice-2-open-output">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/logic/eng-aice-2-open</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.2</rate_limit> <!-- 5 seconds -->
</actuator>
<actuator name="/ECAM/warnings/timer/eng-aice-1-closed-output">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/logic/eng-aice-1-closed</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.1</rate_limit> <!-- 10 seconds -->
</actuator>
<actuator name="/ECAM/warnings/timer/eng-aice-2-closed-output">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/logic/eng-aice-2-closed</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.1</rate_limit> <!-- 10 seconds -->
</actuator>
<actuator name="/ECAM/warnings/logic/wing-anti-ice-flipflop-set">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/logic/wing-anti-ice-flipflop-set-input</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.0285714</rate_limit> <!-- 35 seconds -->
</actuator>
<actuator name="/ECAM/warnings/timer/phase-1">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/timer/phase-1-input</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.5</rate_limit> <!-- 2 seconds -->
</actuator>
<actuator name="/ECAM/warnings/timer/wing-anti-ice-25">
<description>Timer for the ECAM system</description>
<input>/controls/ice-protection/wing</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.04</rate_limit> <!-- 25 seconds -->
</actuator>
<actuator name="/ECAM/warnings/logic/wing-anti-ice-left-closed-set">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/logic/wing-anti-ice-left-closed-set-input</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.066666</rate_limit> <!-- 15 seconds -->
</actuator>
<actuator name="/ECAM/warnings/logic/wing-anti-ice-right-closed-set">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/logic/wing-anti-ice-right-closed-set-input</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.066666</rate_limit> <!-- 15 seconds -->
</actuator>
<actuator name="/ECAM/warnings/logic/proc-wai-shutdown-output">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/logic/proc-wai-shutdown-flipflop</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.1</rate_limit> <!-- 10 seconds -->
</actuator>
<actuator name="/ECAM/warnings/timer/wing-hi-pr-left">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/logic/wing-hi-pr-left-input</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.025</rate_limit> <!-- 40 seconds -->
</actuator>
<actuator name="/ECAM/warnings/timer/wing-hi-pr-right">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/logic/wing-hi-pr-right-input</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.025</rate_limit> <!-- 40 seconds -->
</actuator>
<actuator name="/ECAM/warnings/timer/cranking-35-sec">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/logic/cranking-35-sec-input</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.028571</rate_limit> <!-- 35 seconds -->
</actuator>
<actuator name="/ECAM/warnings/timer/pack-1-fault-closed">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/logic/pack-1-fault-closed-input</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.1</rate_limit> <!-- 10 seconds -->
</actuator>
<actuator name="/ECAM/warnings/timer/pack-2-fault-closed">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/logic/pack-2-fault-closed-input</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.1</rate_limit> <!-- 10 seconds -->
</actuator>
<actuator name="/ECAM/warnings/timer/pack-1-disagree">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/logic/pack-1-disagree-input</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.1</rate_limit> <!-- 10 seconds -->
</actuator>
<actuator name="/ECAM/warnings/timer/pack-2-disagree">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/logic/pack-2-disagree-input</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.1</rate_limit> <!-- 10 seconds -->
</actuator>
@ -275,98 +268,98 @@
<actuator name="/ECAM/warnings/timer/pack-1-fault-5">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/logic/pack-1-fault-input</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.20</rate_limit> <!-- 5 seconds -->
</actuator>
<actuator name="/ECAM/warnings/timer/pack-2-fault-5">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/logic/pack-2-fault-input</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.20</rate_limit> <!-- 5 seconds -->
</actuator>
<actuator name="/ECAM/warnings/timer/pack-1-fault-2">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/logic/pack-1-fault-warning-input</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.50</rate_limit> <!-- 2 seconds -->
</actuator>
<actuator name="/ECAM/warnings/timer/pack-2-fault-2">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/logic/pack-2-fault-warning-input</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.50</rate_limit> <!-- 2 seconds -->
</actuator>
<actuator name="/ECAM/warnings/timer/pack-1-off">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/logic/pack-1-off-input</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.0166666</rate_limit> <!-- 60 seconds -->
</actuator>
<actuator name="/ECAM/warnings/timer/pack-2-off">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/logic/pack-2-off-input</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.0166666</rate_limit> <!-- 60 seconds -->
</actuator>
<actuator name="/ECAM/warnings/timer/trim-air-fault">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/logic/trim-air-fault-input</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.2</rate_limit> <!-- 5 seconds -->
</actuator>
<actuator name="/ECAM/warnings/timer/yaw-damper-1-fault">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/logic/yaw-damper-1-fault</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.2</rate_limit> <!-- 5 seconds -->
</actuator>
<actuator name="/ECAM/warnings/timer/yaw-damper-2-fault">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/logic/yaw-damper-2-fault</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.2</rate_limit> <!-- 5 seconds -->
</actuator>
<actuator name="/ECAM/warnings/timer/nav-gpws-terr-fault">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/logic/nav-gpws-terr-fault</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">1.0</rate_limit> <!-- 1 second -->
</actuator>
<actuator name="/ECAM/warnings/timer/gen-1-fault-set">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/logic/gen-1-fault-set</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.1818</rate_limit> <!-- 5.5 seconds -->
</actuator>
<actuator name="/ECAM/warnings/timer/gen-2-fault-set">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/logic/gen-2-fault-set</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.1818</rate_limit> <!-- 5.5 seconds -->
</actuator>
<actuator name="/ECAM/warnings/timer/apu-gen-fault-set">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/logic/apu-gen-fault-set</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.2</rate_limit> <!-- 5 seconds -->
</actuator>
<actuator name="/ECAM/warnings/timer/apu-gen-fault-reset">
<description>Timer for the ECAM system</description>
<input>/ECAM/warnings/logic/apu-gen-fault-reset</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.5</rate_limit> <!-- 2 seconds -->
</actuator>
</channel>
@ -1343,7 +1336,8 @@
/systems/navigation/adr/operating-1 eq 1
/systems/navigation/adr/operating-3 eq 1
/systems/electrical/bus/dc-ess-shed ge 25
/systems/electrical/bus/ac-1 ge 110
/systems/electrical/bus/dc-ess ge 25
/systems/electrical/bus/ac-ess ge 110
/systems/fctl/fac1-healthy-signal eq 0
/systems/fctl/fac2-healthy-signal eq 1
</test>
@ -1370,14 +1364,6 @@
</test>
</switch>
<switch name="/ECAM/warnings/logic/yaw-damper-1-fault-green">
<default value="0"/>
<test logic="AND" value="1">
/systems/hydraulic/green-psi lt 1500
/ECAM/warning-phase ne 1
</test>
</switch>
<switch name="/ECAM/warnings/logic/yaw-damper-1-fault-adr">
<default value="0"/>
<test logic="AND" value="1">
@ -1398,7 +1384,7 @@
/systems/electrical/bus/dc-ess-shed ge 25
/systems/electrical/bus/ac-1 ge 110
/ECAM/warnings/logic/yaw-damper-1-fault-eng-start eq 0
/ECAM/warnings/logic/yaw-damper-1-fault-green eq 0
/systems/hydraulic/green-psi ge 1500
/ECAM/warnings/logic/yaw-damper-1-fault-adr eq 0
/ECAM/irs-in-align eq 0
/systems/fctl/yawdamper-1-active eq 0
@ -1415,14 +1401,6 @@
</test>
</switch>
<switch name="/ECAM/warnings/logic/yaw-damper-2-fault-yellow">
<default value="0"/>
<test logic="AND" value="1">
/systems/hydraulic/yellow-psi lt 1500
/ECAM/warning-phase ne 1
</test>
</switch>
<switch name="/ECAM/warnings/logic/yaw-damper-2-fault-adr">
<default value="0"/>
<test logic="AND" value="1">
@ -1443,7 +1421,7 @@
/systems/electrical/bus/dc-2 ge 25
/systems/electrical/bus/ac-2 ge 110
/ECAM/warnings/logic/yaw-damper-2-fault-eng-start eq 0
/ECAM/warnings/logic/yaw-damper-2-fault-yellow eq 0
/systems/hydraulic/yellow-psi ge 1500
/ECAM/warnings/logic/yaw-damper-2-fault-adr eq 0
/ECAM/irs-in-align eq 0
/systems/fctl/yawdamper-2-active eq 0
@ -1451,23 +1429,43 @@
</test>
</switch>
<switch name="/ECAM/warnings/logic/yaw-damper-12-fault">
<default value="0"/>
<test logic="AND" value="1">
/ECAM/irs-in-align eq 0
<test logic="OR">
<switch name="/ECAM/warnings/logic/adr-off-input">
<default value="1"/>
<test logic="OR" value="0">
/systems/navigation/adr/operating-1 eq 1
/systems/navigation/adr/operating-2 eq 1
/systems/navigation/adr/operating-3 eq 1
</test>
</switch>
<actuator name="/ECAM/warnings/logic/adr-off">
<input>/ECAM/warnings/logic/adr-off-input</input>
<rate_limit sense="decr">120</rate_limit>
<rate_limit sense="incr">0.5</rate_limit>
</actuator>
<switch name="/ECAM/warnings/logic/green-yellow-press-on-monostable-input">
<default value="0"/>
<test logic="AND" value="1">
/systems/hydraulics/warnings/green-lo-pr eq 0
/systems/hydraulics/warnings/yellow-lo-pr eq 0
</test>
</switch>
<switch name="/ECAM/warnings/logic/yaw-damper-12-fault">
<default value="0"/>
<test logic="AND" value="1">
/ECAM/irs-in-align eq 0
/ECAM/warnings/logic/adr-off ne 1
<test logic="OR">
/systems/electrical/bus/dc-ess-shed ge 25
/systems/electrical/bus/ac-1 ge 110
/systems/electrical/bus/dc-2 ge 25
/systems/electrical/bus/ac-2 ge 110
</test>
/ECAM/warnings/logic/yaw-damper-1-fault-green eq 0
/ECAM/warnings/logic/yaw-damper-2-fault-yellow eq 0
/ECAM/warnings/logic/green-yellow-press-on-monostable eq 0
/systems/hydraulic/green-psi ge 1500
/systems/hydraulic/yellow-psi ge 1500
/ECAM/warnings/logic/yaw-damper-1-fault eq 1
/ECAM/warnings/logic/yaw-damper-2-fault eq 1
</test>
@ -1515,7 +1513,7 @@
<actuator name="/ECAM/warnings/logic/glc-1-online-2-sec">
<input>/systems/electrical/relay/gen-1-glc/contact-pos</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.5</rate_limit> <!-- 2 seconds -->
</actuator>
@ -1576,7 +1574,7 @@
<actuator name="/ECAM/warnings/logic/glc-2-online-2-sec">
<input>/systems/electrical/relay/gen-2-glc/contact-pos</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.5</rate_limit> <!-- 2 seconds -->
</actuator>
@ -1773,7 +1771,7 @@
<actuator name="/ECAM/warnings/logic/eng/ground-spoilers-output">
<input>/ECAM/warnings/logic/eng/ground-spoilers</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">2</rate_limit> <!-- 0.5 seconds -->
</actuator>
@ -1799,19 +1797,19 @@
<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>
<actuator name="/ECAM/warnings/logic/eng/eng-1-tla-abv-6-output">
<input>/ECAM/warnings/logic/eng/eng-1-tla-abv-6</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">1</rate_limit> <!-- 1 seconds -->
</actuator>
<actuator name="/ECAM/warnings/logic/eng/eng-1-tla-abv-6-2-output">
<input>/ECAM/warnings/logic/eng/eng-1-tla-abv-6-2</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">1</rate_limit> <!-- 1 seconds -->
</actuator>
@ -1824,7 +1822,7 @@
<actuator name="/ECAM/warnings/logic/eng/eng-1-tla-idle-output">
<input>/ECAM/warnings/logic/eng/eng-1-tla-idle</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">1</rate_limit> <!-- 1 seconds -->
</actuator>
@ -1837,7 +1835,7 @@
<actuator name="/ECAM/warnings/logic/eng/eng-1-reverse-output">
<input>/ECAM/warnings/logic/eng/eng-1-reverse</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">1</rate_limit> <!-- 1 seconds -->
</actuator>
@ -1852,19 +1850,19 @@
<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>
<actuator name="/ECAM/warnings/logic/eng/eng-2-tla-abv-6-output">
<input>/ECAM/warnings/logic/eng/eng-2-tla-abv-6</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">1</rate_limit> <!-- 1 seconds -->
</actuator>
<actuator name="/ECAM/warnings/logic/eng/eng-2-tla-abv-6-2-output">
<input>/ECAM/warnings/logic/eng/eng-2-tla-abv-6-2</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">1</rate_limit> <!-- 1 seconds -->
</actuator>
@ -1877,7 +1875,7 @@
<actuator name="/ECAM/warnings/logic/eng/eng-2-tla-idle-output">
<input>/ECAM/warnings/logic/eng/eng-2-tla-idle</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">1</rate_limit> <!-- 1 seconds -->
</actuator>
@ -1890,7 +1888,7 @@
<actuator name="/ECAM/warnings/logic/eng/eng-2-reverse-output">
<input>/ECAM/warnings/logic/eng/eng-2-reverse</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">1</rate_limit> <!-- 1 seconds -->
</actuator>
@ -2046,7 +2044,7 @@
<actuator name="/ECAM/warnings/fctl/lrElevFault-output">
<input>/ECAM/warnings/fctl/lrElevFault</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">3.33333333333</rate_limit> <!-- 0.3 seconds -->
</actuator>
@ -2057,7 +2055,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
@ -2093,7 +2091,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
@ -2147,7 +2145,7 @@
<actuator name="/ECAM/warnings/fctl/gear-not-down-locked-set-output">
<input>/ECAM/warnings/fctl/gear-not-down-locked-set-input</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.03333333333</rate_limit> <!-- 30 seconds -->
</actuator>
@ -2180,7 +2178,7 @@
<actuator name="/ECAM/warnings/hyd/engines-2-online-output">
<input>/ECAM/warnings/hyd/engines-2-online</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">1</rate_limit>
</actuator>
@ -2195,7 +2193,7 @@
<actuator name="/ECAM/warnings/hyd/engines-2-off-in-air-output">
<input>/ECAM/warnings/hyd/engines-2-off-in-air</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.2</rate_limit> <!-- 5 seconds -->
</actuator>
@ -2214,7 +2212,7 @@
<actuator name="/ECAM/warnings/hyd/engine-1-start-output">
<input>/ECAM/warnings/hyd/engine-1-start</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">1</rate_limit>
</actuator>
@ -2233,7 +2231,7 @@
<actuator name="/ECAM/warnings/hyd/engine-2-start-output">
<input>/ECAM/warnings/hyd/engine-2-start</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">1</rate_limit>
</actuator>
@ -2373,4 +2371,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

@ -477,7 +477,7 @@
<actuator name="/systems/hydraulic/sources/ptu/ptu-loop-sound">
<input>/systems/hydraulic/sources/ptu/ptu-loop-sound-cmd</input>
<rate_limit sense="incr">1</rate_limit>
<rate_limit sense="decr">100</rate_limit> <!-- instant -->
<rate_limit sense="decr">120</rate_limit> <!-- instant -->
</actuator>
<switch name="/systems/hydraulic/sources/ptu/yellow-green">

View file

@ -2,7 +2,7 @@
<!-- Copyright (c) 2020 Jonathan Redpath -->
<system name="A320: APU">
<system name="A320: MISC">
<channel name="CVR" execrate="8">
@ -29,4 +29,14 @@
</channel>
<channel name="IESI" execrate="8">
<actuator name="/instrumentation/iesi/att-reset">
<input>/instrumentation/iesi/att-reset-cmd</input>
<rate_limit sense="incr">0.5</rate_limit>
<rate_limit sense="decr">100</rate_limit>
</actuator>
</channel>
</system>

View file

@ -214,7 +214,7 @@
<actuator name="/systems/pneumatics/valves/engine-1-prv-valve-autoclose-psi">
<input>/systems/pneumatics/valves/engine-1-prv-valve-autoclose-psi-cmd</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.0666</rate_limit> <!-- 15 seconds -->
</actuator>
@ -294,7 +294,7 @@
<actuator name="/systems/pneumatics/valves/engine-2-prv-valve-autoclose-psi">
<input>/systems/pneumatics/valves/engine-2-prv-valve-autoclose-psi-cmd</input>
<rate_limit sense="decr">100</rate_limit> <!-- Instant -->
<rate_limit sense="decr">120</rate_limit> <!-- Instant -->
<rate_limit sense="incr">0.0666</rate_limit> <!-- 15 seconds -->
</actuator>
@ -438,7 +438,7 @@
<actuator name="/systems/pneumatics/valves/wing-ice-gnd">
<input>/systems/pneumatics/valves/wing-ice-gnd-cmd</input>
<rate_limit sense="incr">0.033333</rate_limit> <!-- 30 seconds -->
<rate_limit sense="decr">100</rate_limit>
<rate_limit sense="decr">120</rate_limit>
</actuator>
<switch name="/systems/pneumatics/valves/wing-ice-1-cmd">
@ -981,19 +981,19 @@
<actuator name="/systems/pneumatics/precooler/calc/ovht-5">
<input>/systems/pneumatics/precooler/calc/ovht-5-true</input>
<rate_limit sense="incr">0.2</rate_limit>
<rate_limit sense="decr">100</rate_limit>
<rate_limit sense="decr">120</rate_limit>
</actuator>
<actuator name="/systems/pneumatics/precooler/calc/ovht-15">
<input>/systems/pneumatics/precooler/calc/ovht-15-true</input>
<rate_limit sense="incr">0.06666</rate_limit>
<rate_limit sense="decr">100</rate_limit>
<rate_limit sense="decr">120</rate_limit>
</actuator>
<actuator name="/systems/pneumatics/precooler/calc/ovht-55">
<input>/systems/pneumatics/precooler/calc/ovht-55-true</input>
<rate_limit sense="incr">0.018182</rate_limit>
<rate_limit sense="decr">100</rate_limit>
<rate_limit sense="decr">120</rate_limit>
</actuator>
<switch name="/systems/pneumatics/precooler/ovht-1">
@ -1094,19 +1094,19 @@
<actuator name="/systems/pneumatics/precooler/calc/ovht-5-2">
<input>/systems/pneumatics/precooler/calc/ovht-5-true-2</input>
<rate_limit sense="incr">0.2</rate_limit>
<rate_limit sense="decr">100</rate_limit>
<rate_limit sense="decr">120</rate_limit>
</actuator>
<actuator name="/systems/pneumatics/precooler/calc/ovht-15-2">
<input>/systems/pneumatics/precooler/calc/ovht-15-true-2</input>
<rate_limit sense="incr">0.06666</rate_limit>
<rate_limit sense="decr">100</rate_limit>
<rate_limit sense="decr">120</rate_limit>
</actuator>
<actuator name="/systems/pneumatics/precooler/calc/ovht-55-2">
<input>/systems/pneumatics/precooler/calc/ovht-55-true-2</input>
<rate_limit sense="incr">0.018182</rate_limit>
<rate_limit sense="decr">100</rate_limit>
<rate_limit sense="decr">120</rate_limit>
</actuator>
<switch name="/systems/pneumatics/precooler/ovht-2">
@ -1180,7 +1180,7 @@
<actuator name="/systems/pneumatics/warnings/apu-bleed-not-on">
<input>/systems/pneumatics/warnings/apu-bleed-not-on-cmd</input>
<rate_limit sense="incr">0.1</rate_limit>
<rate_limit sense="decr">100</rate_limit>
<rate_limit sense="decr">120</rate_limit>
</actuator>
<switch name="/systems/pneumatics/warnings/crossbleed-disag-open">

View file

@ -203,16 +203,15 @@
<output>ECAM/phases/monostable/gnd-output</output>
</flipflop>
<flipflop>
<type>monostable</type>
<time>
<value>300.0</value>
<value>2.5</value>
</time>
<S>
<property>ECAM/phases/monostable/phase-1-300</property>
<property>/ECAM/ground-calc-immediate</property>
</S>
<output>ECAM/phases/monostable/phase-1-output</output>
<output>ECAM/phases/monostable/gnd-output-2</output>
</flipflop>
<flipflop>
@ -251,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>
@ -304,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>
@ -326,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>
@ -335,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 -->
@ -478,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>
@ -1070,4 +975,58 @@
<output>/ECAM/warnings/fctl/gear-not-down-locked</output>
</flipflop>
<flipflop>
<type>monostable</type>
<time>
<value>40</value>
</time>
<S>
<property>/ECAM/warnings/logic/green-yellow-press-on-monostable-input</property>
</S>
<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>

View file

@ -309,6 +309,33 @@
<filter-time>0.32</filter-time>
</filter>
<filter>
<name>Pitch PFD</name>
<type>gain</type>
<gain>1</gain>
<input>
<expression>
<table>
<property>/orientation/pitch-deg</property>
<entry><ind>-90.0</ind><dep>-57.50</dep></entry>
<entry><ind>-80.0</ind><dep>-47.50</dep></entry>
<entry><ind>-50.0</ind><dep>-32.50</dep></entry>
<entry><ind>-30.0</ind><dep>-22.50</dep></entry>
<entry><ind>-20.0</ind><dep>-17.50</dep></entry>
<entry><ind>-15.0</ind><dep>-13.75</dep></entry>
<entry><ind>-10.0</ind><dep>-10.00</dep></entry>
<entry><ind> 0.0</ind><dep> 0.00</dep></entry>
<entry><ind> 27.5</ind><dep> 27.50</dep></entry>
<entry><ind> 30.0</ind><dep> 28.75</dep></entry>
<entry><ind> 50.0</ind><dep> 38.75</dep></entry>
<entry><ind> 80.0</ind><dep> 53.75</dep></entry>
<entry><ind> 90.0</ind><dep> 63.75</dep></entry>
</table>
</expression>
</input>
<output>/instrumentation/pfd/pitch-deg-non-linear</output>
</filter>
<filter>
<name>Ground Horizon</name>
<type>gain</type>
@ -465,4 +492,44 @@
<filter-time>0.16</filter-time>
</filter>
<filter>
<name>IESI Slip/Skid Indicator</name>
<debug>false</debug>
<type>gain</type>
<gain>1</gain>
<input>
<expression>
<table>
<property>/fdm/jsbsim/accelerations/Ny</property>
<entry><ind>-0.20</ind><dep>-105</dep></entry>
<entry><ind>-0.01</ind><dep> 0</dep></entry>
<entry><ind> 0.00</ind><dep> 0</dep></entry>
<entry><ind> 0.01</ind><dep> 0</dep></entry>
<entry><ind> 0.20</ind><dep> 105</dep></entry>
</table>
</expression>
</input>
<output>/instrumentation/iesi/slip-skid</output>
</filter>
<filter>
<name>IESI Pitch</name>
<debug>false</debug>
<type>gain</type>
<gain>1</gain>
<input>
<expression>
<table>
<property>/orientation/pitch-deg</property>
<entry><ind>-80</ind><dep>-65</dep></entry>
<entry><ind>-50</ind><dep>-50</dep></entry>
<entry><ind> 0</ind><dep> 0</dep></entry>
<entry><ind> 50</ind><dep> 50</dep></entry>
<entry><ind> 80</ind><dep> 65</dep></entry>
</table>
</expression>
</input>
<output>/instrumentation/iesi/pitch-deg</output>
</filter>
</PropertyList>