1
0
Fork 0

Major bugfixes to failures; correct property references; optimize it-fbw

This commit is contained in:
legoboyvdlp R 2020-07-11 20:13:21 +01:00
parent f282e72243
commit 85779a5676
15 changed files with 472 additions and 561 deletions

View file

@ -620,9 +620,6 @@
<internal>
<cost-index type="int">0</cost-index>
</internal>
<status>
<to-state type="bool">1</to-state>
</status>
</FMGC>
<controls>
@ -715,15 +712,6 @@
</engine>
</engines>
<fctl>
<lights>
<elac1-fault type="bool">0</elac1-fault>
<elac2-fault type="bool">0</elac2-fault>
<sec1-fault type="bool">0</sec1-fault>
<sec2-fault type="bool">0</sec2-fault>
<sec3-fault type="bool">0</sec3-fault>
<fac1-fault type="bool">0</fac1-fault>
<fac2-fault type="bool">0</fac2-fault>
</lights>
<switches>
<elac1 type="bool">0</elac1>
<elac2 type="bool">0</elac2>
@ -1059,6 +1047,7 @@
</ess-tr-contactor>
</relay>
<some-electric-thingie>
<emer-elec-config type="bool">0</emer-elec-config>
<emer-gen-operate type="bool">0</emer-gen-operate>
</some-electric-thingie>
<sources>
@ -1151,16 +1140,18 @@
<x-bleed-valve type="bool">0</x-bleed-valve>
</pneumatics>
<rudder type="bool">0</rudder>
<spoiler-l1 type="bool">0</spoiler-l1>
<spoiler-l2 type="bool">0</spoiler-l2>
<spoiler-l3 type="bool">0</spoiler-l3>
<spoiler-l4 type="bool">0</spoiler-l4>
<spoiler-l5 type="bool">0</spoiler-l5>
<spoiler-r1 type="bool">0</spoiler-r1>
<spoiler-r2 type="bool">0</spoiler-r2>
<spoiler-r3 type="bool">0</spoiler-r3>
<spoiler-r4 type="bool">0</spoiler-r4>
<spoiler-r5 type="bool">0</spoiler-r5>
<spoilers>
<spoiler-l1 type="bool">0</spoiler-l1>
<spoiler-l2 type="bool">0</spoiler-l2>
<spoiler-l3 type="bool">0</spoiler-l3>
<spoiler-l4 type="bool">0</spoiler-l4>
<spoiler-l5 type="bool">0</spoiler-l5>
<spoiler-r1 type="bool">0</spoiler-r1>
<spoiler-r2 type="bool">0</spoiler-r2>
<spoiler-r3 type="bool">0</spoiler-r3>
<spoiler-r4 type="bool">0</spoiler-r4>
<spoiler-r5 type="bool">0</spoiler-r5>
</spoilers>
<engine-left-fire type="bool">0</engine-left-fire>
<engine-right-fire type="bool">0</engine-right-fire>
<apu-fire type="bool">0</apu-fire>
@ -1219,6 +1210,7 @@
</valves>
<fuel-used-1 type="double">0</fuel-used-1>
<fuel-used-2 type="double">0</fuel-used-2>
<mode-fault type="bool">0</mode-fault>
</fuel>
<hydraulic n="0">
<sources>

View file

@ -26,28 +26,28 @@ var failReset = func {
}
var failResetOld = func {
setprop("/systems/failures/elac1", 0);
setprop("/systems/failures/elac2", 0);
setprop("/systems/failures/sec1", 0);
setprop("/systems/failures/sec2", 0);
setprop("/systems/failures/sec3", 0);
setprop("/systems/failures/fac1", 0);
setprop("/systems/failures/fac2", 0);
setprop("/systems/failures/fctl/elac1", 0);
setprop("/systems/failures/fctl/elac2", 0);
setprop("/systems/failures/fctl/sec1", 0);
setprop("/systems/failures/fctl/sec2", 0);
setprop("/systems/failures/fctl/sec3", 0);
setprop("/systems/failures/fctl/fac1", 0);
setprop("/systems/failures/fctl/fac2", 0);
setprop("/systems/failures/aileron-left", 0);
setprop("/systems/failures/aileron-right", 0);
setprop("/systems/failures/elevator-left", 0);
setprop("/systems/failures/elevator-right", 0);
setprop("/systems/failures/rudder", 0);
setprop("/systems/failures/spoiler-l1", 0);
setprop("/systems/failures/spoiler-l2", 0);
setprop("/systems/failures/spoiler-l3", 0);
setprop("/systems/failures/spoiler-l4", 0);
setprop("/systems/failures/spoiler-l5", 0);
setprop("/systems/failures/spoiler-r1", 0);
setprop("/systems/failures/spoiler-r2", 0);
setprop("/systems/failures/spoiler-r3", 0);
setprop("/systems/failures/spoiler-r4", 0);
setprop("/systems/failures/spoiler-r5", 0);
setprop("/systems/failures/spoilers/spoiler-l1", 0);
setprop("/systems/failures/spoilers/spoiler-l2", 0);
setprop("/systems/failures/spoilers/spoiler-l3", 0);
setprop("/systems/failures/spoilers/spoiler-l4", 0);
setprop("/systems/failures/spoilers/spoiler-l5", 0);
setprop("/systems/failures/spoilers/spoiler-r1", 0);
setprop("/systems/failures/spoilers/spoiler-r2", 0);
setprop("/systems/failures/spoilers/spoiler-r3", 0);
setprop("/systems/failures/spoilers/spoiler-r4", 0);
setprop("/systems/failures/spoilers/spoiler-r5", 0);
setprop("/systems/failures/hyd-blue", 0);
setprop("/systems/failures/hyd-green", 0);
setprop("/systems/failures/hyd-yellow", 0);
@ -56,13 +56,6 @@ var failResetOld = func {
setprop("/systems/failures/pump-green", 0);
setprop("/systems/failures/pump-yellow-eng", 0);
setprop("/systems/failures/pump-yellow-elec", 0);
setprop("/systems/failures/tank0pump1", 0);
setprop("/systems/failures/tank0pump2", 0);
setprop("/systems/failures/tank1pump1", 0);
setprop("/systems/failures/tank1pump2", 0);
setprop("/systems/failures/tank2pump1", 0);
setprop("/systems/failures/tank2pump2", 0);
setprop("/systems/failures/fuelmode", 0);
setprop("/systems/failures/cargo-aft-fire", 0);
setprop("/systems/failures/cargo-fwd-fire", 0);
setprop("/systems/failures/engine-left-fire", 0);

View file

@ -198,26 +198,26 @@ var spoiler_R2 = props.globals.getNode("/fdm/jsbsim/hydraulics/spoiler-r2/final-
var spoiler_R3 = props.globals.getNode("/fdm/jsbsim/hydraulics/spoiler-r3/final-deg", 1);
var spoiler_R4 = props.globals.getNode("/fdm/jsbsim/hydraulics/spoiler-r4/final-deg", 1);
var spoiler_R5 = props.globals.getNode("/fdm/jsbsim/hydraulics/spoiler-r5/final-deg", 1);
var spoiler_L1_fail = props.globals.getNode("/systems/failures/spoiler-l1", 1);
var spoiler_L2_fail = props.globals.getNode("/systems/failures/spoiler-l2", 1);
var spoiler_L3_fail = props.globals.getNode("/systems/failures/spoiler-l3", 1);
var spoiler_L4_fail = props.globals.getNode("/systems/failures/spoiler-l4", 1);
var spoiler_L5_fail = props.globals.getNode("/systems/failures/spoiler-l5", 1);
var spoiler_R1_fail = props.globals.getNode("/systems/failures/spoiler-r1", 1);
var spoiler_R2_fail = props.globals.getNode("/systems/failures/spoiler-r2", 1);
var spoiler_R3_fail = props.globals.getNode("/systems/failures/spoiler-r3", 1);
var spoiler_R4_fail = props.globals.getNode("/systems/failures/spoiler-r4", 1);
var spoiler_R5_fail = props.globals.getNode("/systems/failures/spoiler-r5", 1);
var spoiler_L1_fail = props.globals.getNode("/systems/failures/spoilers/spoiler-l1", 1);
var spoiler_L2_fail = props.globals.getNode("/systems/failures/spoilers/spoiler-l2", 1);
var spoiler_L3_fail = props.globals.getNode("/systems/failures/spoilers/spoiler-l3", 1);
var spoiler_L4_fail = props.globals.getNode("/systems/failures/spoilers/spoiler-l4", 1);
var spoiler_L5_fail = props.globals.getNode("/systems/failures/spoilers/spoiler-l5", 1);
var spoiler_R1_fail = props.globals.getNode("/systems/failures/spoilers/spoiler-r1", 1);
var spoiler_R2_fail = props.globals.getNode("/systems/failures/spoilers/spoiler-r2", 1);
var spoiler_R3_fail = props.globals.getNode("/systems/failures/spoilers/spoiler-r3", 1);
var spoiler_R4_fail = props.globals.getNode("/systems/failures/spoilers/spoiler-r4", 1);
var spoiler_R5_fail = props.globals.getNode("/systems/failures/spoilers/spoiler-r5", 1);
var elac1 = props.globals.getNode("/systems/fctl/elac1", 1);
var elac2 = props.globals.getNode("/systems/fctl/elac2", 1);
var sec1 = props.globals.getNode("/systems/fctl/sec1", 1);
var sec2 = props.globals.getNode("/systems/fctl/sec2", 1);
var sec3 = props.globals.getNode("/systems/fctl/sec3", 1);
var elac1_fail = props.globals.getNode("/systems/failures/elac1", 1);
var elac2_fail = props.globals.getNode("/systems/failures/elac2", 1);
var sec1_fail = props.globals.getNode("/systems/failures/sec1", 1);
var sec2_fail = props.globals.getNode("/systems/failures/sec2", 1);
var sec3_fail = props.globals.getNode("/systems/failures/sec3", 1);
var elac1_fail = props.globals.getNode("/systems/failures/fctl/elac1", 1);
var elac2_fail = props.globals.getNode("/systems/failures/fctl/elac2", 1);
var sec1_fail = props.globals.getNode("/systems/failures/fctl/sec1", 1);
var sec2_fail = props.globals.getNode("/systems/failures/fctl/sec2", 1);
var sec3_fail = props.globals.getNode("/systems/failures/fctl/sec3", 1);
var eng1_n1 = props.globals.getNode("/engines/engine[0]/n1-actual", 1);
var eng2_n1 = props.globals.getNode("/engines/engine[1]/n1-actual", 1);
var total_fuel_lbs = props.globals.getNode("/consumables/fuel/total-fuel-lbs", 1);
@ -231,13 +231,6 @@ var fuel_right_outer_temp = props.globals.getNode("/consumables/fuel/tank[4]/tem
var fuel_right_inner_temp = props.globals.getNode("/consumables/fuel/tank[3]/temperature_degC", 1);
var cutoff_switch1 = props.globals.getNode("/controls/engines/engine[0]/cutoff-switch", 1);
var cutoff_switch2 = props.globals.getNode("/controls/engines/engine[1]/cutoff-switch", 1);
var fuel_xfeed = props.globals.getNode("/controls/fuel/x-feed", 1);
var tank0pump1 = props.globals.getNode("/controls/fuel/tank0pump1", 1);
var tank0pump2 = props.globals.getNode("/controls/fuel/tank0pump2", 1);
var tank1pump1 = props.globals.getNode("/controls/fuel/tank1pump1", 1);
var tank1pump2 = props.globals.getNode("/controls/fuel/tank1pump2", 1);
var tank2pump1 = props.globals.getNode("/controls/fuel/tank2pump1", 1);
var tank2pump2 = props.globals.getNode("/controls/fuel/tank2pump2", 1);
var autobreak_mode = props.globals.getNode("/controls/autobrake/mode", 1);
var gear1_pos = props.globals.getNode("/gear/gear[0]/position-norm", 1);
var gear2_pos = props.globals.getNode("/gear/gear[1]/position-norm", 1);
@ -2505,7 +2498,7 @@ var canvas_lowerECAM_fuel = {
# TODO use the valve prop
# TODO add amber when disagree between switch and btn
# TODO add transition state
if (systems.FUEL.Valves.crossfeed.getValue() == 1) {
if (systems.FUEL.Valves.crossfeed.getBoolValue()) {
me["FUEL-XFEED"].setRotation(0);
me["FUEL-XFEED-pipes"].show();
} else {
@ -2514,7 +2507,7 @@ var canvas_lowerECAM_fuel = {
}
# TODO add LO indication
if (systems.FUEL.Switches.pumpLeft1.getValue() == 1) {
if (systems.FUEL.Switches.pumpLeft1.getBoolValue()) {
me["FUEL-Pump-Left-1-Open"].show();
me["FUEL-Pump-Left-1-Closed"].hide();
me["FUEL-Pump-Left-1"].setColor(0.0509,0.7529,0.2941);
@ -2527,7 +2520,7 @@ var canvas_lowerECAM_fuel = {
}
# TODO add LO indication
if (systems.FUEL.Switches.pumpLeft2.getValue() == 1) {
if (systems.FUEL.Switches.pumpLeft2.getBoolValue()) {
me["FUEL-Pump-Left-2-Open"].show();
me["FUEL-Pump-Left-2-Closed"].hide();
me["FUEL-Pump-Left-2"].setColor(0.0509,0.7529,0.2941);
@ -2540,7 +2533,7 @@ var canvas_lowerECAM_fuel = {
}
# TODO add functionality to match FCOM 1.28.20 "Amber: Transfer valve is open, whereas commanded closed in automatic or manual mode"
if (systems.FUEL.Switches.pumpCenter1.getValue() == 1) {
if (systems.FUEL.Switches.pumpCenter1.getBoolValue()) {
me["FUEL-Pump-Center-1-Open"].show();
me["FUEL-Pump-Center-1-Closed"].hide();
me["FUEL-Pump-Center-1"].setColor(0.0509,0.7529,0.2941);
@ -2553,7 +2546,7 @@ var canvas_lowerECAM_fuel = {
}
# TODO add LO indication
if (systems.FUEL.Switches.pumpCenter2.getValue() == 1) {
if (systems.FUEL.Switches.pumpCenter2.getBoolValue()) {
me["FUEL-Pump-Center-2-Open"].show();
me["FUEL-Pump-Center-2-Closed"].hide();
me["FUEL-Pump-Center-2"].setColor(0.0509,0.7529,0.2941);
@ -2566,7 +2559,7 @@ var canvas_lowerECAM_fuel = {
}
# TODO add LO indication
if (systems.FUEL.Switches.pumpRight1.getValue() == 1) {
if (systems.FUEL.Switches.pumpRight1.getBoolValue()) {
me["FUEL-Pump-Right-1-Open"].show();
me["FUEL-Pump-Right-1-Closed"].hide();
me["FUEL-Pump-Right-1"].setColor(0.0509,0.7529,0.2941);
@ -2579,7 +2572,7 @@ var canvas_lowerECAM_fuel = {
}
# TODO add LO indication
if (systems.FUEL.Switches.pumpRight2.getValue() == 1) {
if (systems.FUEL.Switches.pumpRight2.getBoolValue()) {
me["FUEL-Pump-Right-2-Open"].show();
me["FUEL-Pump-Right-2-Closed"].hide();
me["FUEL-Pump-Right-2"].setColor(0.0509,0.7529,0.2941);

View file

@ -1242,7 +1242,11 @@
<or>
<and>
<equals>
<property>systems/failures/elac1-fault</property>
<property>systems/fctl/lights/elac1-fault</property>
<value>1</value>
</equals>
<equals>
<property>controls/fctl/switches/elac1</property>
<value>1</value>
</equals>
</and>
@ -1305,7 +1309,7 @@
<or>
<and>
<equals>
<property>systems/failures/sec1</property>
<property>systems/fctl/lights/sec1-fault</property>
<value>1</value>
</equals>
<equals>
@ -1372,7 +1376,7 @@
<or>
<and>
<equals>
<property>systems/failures/fac1-fault</property>
<property>systems/fctl/lights/fac1-fault</property>
<value>1</value>
</equals>
<equals>
@ -1439,7 +1443,7 @@
<or>
<and>
<equals>
<property>systems/failures/elac2-fault</property>
<property>systems/fctl/lights/elac2-fault</property>
<value>1</value>
</equals>
<equals>
@ -1472,7 +1476,7 @@
</condition>
</animation>
<!-- SEC 3 -->
<!-- SEC 2 -->
<animation>
<type>pick</type>
<object-name>SEC2Btn1</object-name>
@ -1506,7 +1510,7 @@
<or>
<and>
<equals>
<property>systems/failures/sec2</property>
<property>systems/fctl/lights/sec2-fault</property>
<value>1</value>
</equals>
<equals>
@ -1573,7 +1577,7 @@
<or>
<and>
<equals>
<property>systems/failures/sec3</property>
<property>systems/fctl/lights/sec3-fault</property>
<value>1</value>
</equals>
<equals>
@ -1640,7 +1644,7 @@
<or>
<and>
<equals>
<property>systems/failures/fac2-fault</property>
<property>systems/fctl/lights/fac2-fault</property>
<value>1</value>
</equals>
<equals>
@ -2462,7 +2466,7 @@
<or>
<and>
<equals>
<property>systems/fuel/tank0pump1-fault</property>
<property>systems/failures/fuel/left-tank-pump-1</property>
<value>1</value>
</equals>
<equals>
@ -2527,7 +2531,7 @@
<or>
<and>
<equals>
<property>systems/fuel/tank0pump2-fault</property>
<property>systems/failures/fuel/left-tank-pump-2</property>
<value>1</value>
</equals>
<equals>
@ -2592,7 +2596,7 @@
<or>
<and>
<equals>
<property>systems/fuel/tank1pump1-fault</property>
<property>systems/failures/fuel/center-tank-pump-1</property>
<value>1</value>
</equals>
<equals>
@ -2721,7 +2725,7 @@
<or>
<and>
<equals>
<property>systems/fuel/tank1pump2-fault</property>
<property>systems/failures/fuel/center-tank-pump-2</property>
<value>1</value>
</equals>
<equals>
@ -2786,7 +2790,7 @@
<or>
<and>
<equals>
<property>systems/fuel/tank2pump1-fault</property>
<property>systems/failures/fuel/right-tank-pump-1</property>
<value>1</value>
</equals>
<equals>
@ -2851,7 +2855,7 @@
<or>
<and>
<equals>
<property>systems/fuel/tank2pump2-fault</property>
<property>systems/failures/fuel/right-tank-pump-2</property>
<value>1</value>
</equals>
<equals>
@ -4751,7 +4755,7 @@
<condition>
<or>
<equals>
<property>systems/failures/pack2</property>
<property>systems/failures/pneumatics/pack-2-valve</property>
<value>1</value>
</equals>
<equals>

View file

@ -78,7 +78,6 @@ var vs_needle = props.globals.getNode("/instrumentation/pfd/vs-needle", 1);
var vs_digit = props.globals.getNode("/instrumentation/pfd/vs-digit-trans", 1);
var ap_vs_pfd = props.globals.getNode("/it-autoflight/internal/vert-speed-fpm-pfd", 1);
var athr_arm = props.globals.getNode("/modes/pfd/fma/athr-armed", 1);
var FMGC_max_spd = props.globals.getNode("/FMGC/internal/maxspeed", 1);
var ind_spd_kt = props.globals.getNode("/instrumentation/airspeed-indicator/indicated-speed-kt", 1);
var ind_spd_mach = props.globals.getNode("/instrumentation/airspeed-indicator/indicated-mach", 1);
var at_mach_mode = props.globals.getNode("/it-autoflight/input/kts-mach", 1);
@ -1025,7 +1024,6 @@ var canvas_PFD_1 = {
SPDftrgtdiff: 0,
SPDflaptrgtdiff: 0,
SPDcleantrgtdiff: 0,
FMGC_max: 0,
new: func(canvas_group, file) {
var m = {parents: [canvas_PFD_1, canvas_PFD_base]};
m.init(canvas_group, file);
@ -1186,7 +1184,7 @@ var canvas_PFD_1 = {
me.ASI = ind_spd - 30;
}
me.FMGC_max = FMGC_max_spd.getValue();
me.FMGC_max = fmgc.FMGCInternal.maxspeed;
if (me.FMGC_max <= 30) {
me.ASImax = 0 - me.ASI;
} else if (me.FMGC_max >= 420) {
@ -1198,7 +1196,7 @@ var canvas_PFD_1 = {
me["ASI_scale"].setTranslation(0, me.ASI * 6.6);
me["ASI_max"].setTranslation(0, me.ASImax * -6.6);
if (!getprop("/FMGC/status/to-state") and fmgc.FMGCInternal.phase >= 1 and !wow1.getValue() and !wow2.getValue()) {
if (!fmgc.FMGCInternal.takeoffState and fmgc.FMGCInternal.phase >= 1 and !wow1.getValue() and !wow2.getValue()) {
me.FMGC_vls = getprop("/FMGC/internal/computed-speeds/vls_min");
if (me.FMGC_vls <= 30) {
me.VLSmin = 0 - me.ASI;
@ -1207,7 +1205,7 @@ var canvas_PFD_1 = {
} else {
me.VLSmin = me.FMGC_vls - 30 - me.ASI;
}
me.FMGC_prot = getprop("/FMGC/internal/computed-speeds/alpha_prot");
me.FMGC_prot = fmgc.FMGCInternal.alpha_prot;
if (me.FMGC_prot <= 30) {
me.ALPHAprot = 0 - me.ASI;
} else if (me.FMGC_prot >= 420) {
@ -1215,7 +1213,7 @@ var canvas_PFD_1 = {
} else {
me.ALPHAprot = me.FMGC_prot - 30 - me.ASI;
}
me.FMGC_max = getprop("/FMGC/internal/computed-speeds/alpha_max");
me.FMGC_max = fmgc.FMGCInternal.alpha_max;
if (me.FMGC_max <= 30) {
me.ALPHAmax = 0 - me.ASI;
} else if (me.FMGC_max >= 420) {
@ -1924,7 +1922,7 @@ var canvas_PFD_2 = {
me.ASI = ind_spd - 30;
}
me.FMGC_max = FMGC_max_spd.getValue();
me.FMGC_max = fmgc.FMGCInternal.maxspeed;
if (me.FMGC_max <= 30) {
me.ASImax = 0 - me.ASI;
} else if (me.FMGC_max >= 420) {
@ -1936,7 +1934,7 @@ var canvas_PFD_2 = {
me["ASI_scale"].setTranslation(0, me.ASI * 6.6);
me["ASI_max"].setTranslation(0, me.ASImax * -6.6);
if (!getprop("/FMGC/status/to-state") and fmgc.FMGCInternal.phase >= 1 and !wow1.getValue() and !wow2.getValue()) {
if (!fmgc.FMGCInternal.takeoffState and fmgc.FMGCInternal.phase >= 1 and !wow1.getValue() and !wow2.getValue()) {
me.FMGC_vls = getprop("/FMGC/internal/computed-speeds/vls_min");
if (me.FMGC_vls <= 30) {
me.VLSmin = 0 - me.ASI;
@ -1945,7 +1943,7 @@ var canvas_PFD_2 = {
} else {
me.VLSmin = me.FMGC_vls - 30 - me.ASI;
}
me.FMGC_prot = getprop("/FMGC/internal/computed-speeds/alpha_prot");
me.FMGC_prot = fmgc.FMGCInternal.alpha_prot;
if (me.FMGC_prot <= 30) {
me.ALPHAprot = 0 - me.ASI;
} else if (me.FMGC_prot >= 420) {
@ -1953,7 +1951,7 @@ var canvas_PFD_2 = {
} else {
me.ALPHAprot = me.FMGC_prot - 30 - me.ASI;
}
me.FMGC_max = getprop("/FMGC/internal/computed-speeds/alpha_max");
me.FMGC_max = fmgc.FMGCInternal.alpha_max;
if (me.FMGC_max <= 30) {
me.ALPHAmax = 0 - me.ASI;
} else if (me.FMGC_max >= 420) {

View file

@ -2213,7 +2213,7 @@ var messages_right_memo = func {
land_asap_r.active = 0;
}
if (land_asap_r.active == 0 and getprop("gear/gear[1]/wow") == 0 and ((getprop("fdm/jsbsim/propulsion/tank[0]/contents-lbs") < 1650 and getprop("fdm/jsbsim/propulsion/tank[1]/contents-lbs") < 1650) or ((getprop("systems/electrical/bus/dc-2") < 25 and (getprop("systems/failures/elac1") == 1 or getprop("systems/failures/sec1") == 1)) or (getprop("systems/hydraulic/green-psi") < 1500 and (getprop("systems/failures/elac1") == 1 and getprop("systems/failures/sec1") == 1)) or (getprop("systems/hydraulic/yellow-psi") < 1500 and (getprop("systems/failures/elac1") == 1 and getprop("systems/failures/sec1") == 1)) or (getprop("systems/hydraulic/blue-psi") < 1500 and (getprop("systems/failures/elac2") == 1 and getprop("systems/failures/sec2") == 1))) or (phaseVarMemo3 >= 3 and phaseVarMemo3 <= 8 and (getprop("engines/engine[0]/state") != 3 or getprop("engines/engine[1]/state") != 3)))) {
if (land_asap_r.active == 0 and getprop("gear/gear[1]/wow") == 0 and ((getprop("fdm/jsbsim/propulsion/tank[0]/contents-lbs") < 1650 and getprop("fdm/jsbsim/propulsion/tank[1]/contents-lbs") < 1650) or ((getprop("systems/electrical/bus/dc-2") < 25 and (getprop("systems/failures/fctl/elac1") == 1 or getprop("systems/failures/fctl/sec1") == 1)) or (getprop("systems/hydraulic/green-psi") < 1500 and (getprop("systems/failures/fctl/elac1") == 1 and getprop("systems/failures/fctl/sec1") == 1)) or (getprop("systems/hydraulic/yellow-psi") < 1500 and (getprop("systems/failures/fctl/elac1") == 1 and getprop("systems/failures/fctl/sec1") == 1)) or (getprop("systems/hydraulic/blue-psi") < 1500 and (getprop("systems/failures/fctl/elac2") == 1 and getprop("systems/failures/fctl/sec2") == 1))) or (phaseVarMemo3 >= 3 and phaseVarMemo3 <= 8 and (getprop("engines/engine[0]/state") != 3 or getprop("engines/engine[1]/state") != 3)))) {
land_asap_a.active = 1;
} else {
land_asap_a.active = 0;

View file

@ -3,90 +3,80 @@
# Copyright (c) 2020 Josh Davidson (Octal450)
# If All ELACs Fail, Alternate Law
var mmoIAS = 0;
var cas = 0;
var elac1_sw = 0;
var elac2_sw = 0;
var sec1_sw = 0;
var sec2_sw = 0;
var sec3_sw = 0;
var fac1_sw = 0;
var fac2_sw = 0;
var elac1_fail = 0;
var elac2_fail = 0;
var sec1_fail = 0;
var sec2_fail = 0;
var sec3_fail = 0;
var fac1_fail = 0;
var fac2_fail = 0;
var elac1 = 0;
var elac2 = 0;
var sec1 = 0;
var sec2 = 0;
var sec3 = 0;
var fac1 = 0;
var fac2 = 0;
var ac_ess = 0;
var dc_ess = 0;
var dc_ess_shed = 0;
var ac1 = 0;
var ac2 = 0;
var dc1 = 0;
var dc2 = 0;
var dcHot1 = 0;
var dcHot2 = 0;
var blue = 0;
var green = 0;
var yellow = 0;
var ail = 0;
var roll = 0;
var rollback = 0;
var battery1_sw = 0;
var battery2_sw = 0;
var law = 0;
var FBW = {
degradeLaw: props.globals.getNode("it-fbw/degrade-law"),
activeLaw: props.globals.getNode("it-fbw/law"),
override: props.globals.getNode("it-fbw/override"),
rollBack: props.globals.getNode("it-fbw/roll-back"),
rollLim: props.globals.getNode("it-fbw/roll-lim"),
degradeLaw: props.globals.getNode("/it-fbw/degrade-law"),
activeLaw: props.globals.getNode("/it-fbw/law"),
override: props.globals.getNode("/it-fbw/override"),
rollBack: props.globals.getNode("/it-fbw/roll-back"),
rollLim: props.globals.getNode("/it-fbw/roll-lim"),
Computers: {
elac1: props.globals.getNode("systems/fctl/elac1"),
elac2: props.globals.getNode("systems/fctl/elac2"),
sec1: props.globals.getNode("systems/fctl/sec1"),
sec2: props.globals.getNode("systems/fctl/sec2"),
sec3: props.globals.getNode("systems/fctl/sec3"),
fac1: props.globals.getNode("systems/fctl/fac1"),
fac2: props.globals.getNode("systems/fctl/fac2"),
elac1: props.globals.getNode("/systems/fctl/elac1"),
elac2: props.globals.getNode("/systems/fctl/elac2"),
sec1: props.globals.getNode("/systems/fctl/sec1"),
sec2: props.globals.getNode("/systems/fctl/sec2"),
sec3: props.globals.getNode("/systems/fctl/sec3"),
fac1: props.globals.getNode("/systems/fctl/fac1"),
fac2: props.globals.getNode("/systems/fctl/fac2"),
},
Failures: {
elac1: props.globals.getNode("systems/failures/fctl/elac1"),
elac2: props.globals.getNode("systems/failures/fctl/elac2"),
sec1: props.globals.getNode("systems/failures/fctl/sec1"),
sec2: props.globals.getNode("systems/failures/fctl/sec2"),
sec3: props.globals.getNode("systems/failures/fctl/sec3"),
fac1: props.globals.getNode("systems/failures/fctl/fac1"),
fac2: props.globals.getNode("systems/failures/fctl/fac2"),
elac1: props.globals.getNode("/systems/failures/fctl/elac1"),
elac2: props.globals.getNode("/systems/failures/fctl/elac2"),
sec1: props.globals.getNode("/systems/failures/fctl/sec1"),
sec2: props.globals.getNode("/systems/failures/fctl/sec2"),
sec3: props.globals.getNode("/systems/failures/fctl/sec3"),
fac1: props.globals.getNode("/systems/failures/fctl/fac1"),
fac2: props.globals.getNode("/systems/failures/fctl/fac2"),
spoilerl1: props.globals.getNode("/systems/failures/spoilers/spoiler-l1"),
spoilerl2: props.globals.getNode("/systems/failures/spoilers/spoiler-l2"),
spoilerl3: props.globals.getNode("/systems/failures/spoilers/spoiler-l3"),
spoilerl4: props.globals.getNode("/systems/failures/spoilers/spoiler-l4"),
spoilerl5: props.globals.getNode("/systems/failures/spoilers/spoiler-l5"),
spoilerr1: props.globals.getNode("/systems/failures/spoilers/spoiler-r1"),
spoilerr2: props.globals.getNode("/systems/failures/spoilers/spoiler-r2"),
spoilerr3: props.globals.getNode("/systems/failures/spoilers/spoiler-r3"),
spoilerr4: props.globals.getNode("/systems/failures/spoilers/spoiler-r4"),
spoilerr5: props.globals.getNode("/systems/failures/spoilers/spoiler-r5"),
},
Lights: {
elac1: props.globals.getNode("controls/fctl/lights/elac1-fault"),
elac2: props.globals.getNode("controls/fctl/lights/elac2-fault"),
sec1: props.globals.getNode("controls/fctl/lights/sec1-fault"),
sec2: props.globals.getNode("controls/fctl/lights/sec2-fault"),
sec2: props.globals.getNode("controls/fctl/lights/sec3-fault"),
fac1: props.globals.getNode("controls/fctl/lights/fac1-fault"),
fac2: props.globals.getNode("controls/fctl/lights/fac2-fault"),
elac1: props.globals.getNode("/systems/fctl/lights/elac1-fault"),
elac2: props.globals.getNode("/systems/fctl/lights/elac2-fault"),
sec1: props.globals.getNode("/systems/fctl/lights/sec1-fault"),
sec2: props.globals.getNode("/systems/fctl/lights/sec2-fault"),
sec2: props.globals.getNode("/systems/fctl/lights/sec3-fault"),
fac1: props.globals.getNode("/systems/fctl/lights/fac1-fault"),
fac2: props.globals.getNode("/systems/fctl/lights/fac2-fault"),
},
Protections: {
overspeedRoll: props.globals.getNode("it-fbw/protections/overspeed-roll-back"),
overspeedRoll: props.globals.getNode("/it-fbw/protections/overspeed-roll-back"),
overspeed: props.globals.getNode("/it-fbw/protections/overspeed"),
},
Switches: {
elac1Sw: props.globals.getNode("controls/fctl/switches/elac1"),
elac2Sw: props.globals.getNode("controls/fctl/switches/elac2"),
sec1Sw: props.globals.getNode("controls/fctl/switches/sec1"),
sec2Sw: props.globals.getNode("controls/fctl/switches/sec2"),
sec3Sw: props.globals.getNode("controls/fctl/switches/sec3"),
fac1Sw: props.globals.getNode("controls/fctl/switches/fac1"),
fac2Sw: props.globals.getNode("controls/fctl/switches/fac2"),
elac1Sw: props.globals.getNode("/controls/fctl/switches/elac1"),
elac2Sw: props.globals.getNode("/controls/fctl/switches/elac2"),
sec1Sw: props.globals.getNode("/controls/fctl/switches/sec1"),
sec2Sw: props.globals.getNode("/controls/fctl/switches/sec2"),
sec3Sw: props.globals.getNode("/controls/fctl/switches/sec3"),
fac1Sw: props.globals.getNode("/controls/fctl/switches/fac1"),
fac2Sw: props.globals.getNode("/controls/fctl/switches/fac2"),
},
init: func() {
if (updatet.isRunning) {
@ -135,137 +125,21 @@ var FBW = {
};
var update_loop = func {
elac1_sw = FBW.Switches.elac1Sw.getValue();
elac2_sw = FBW.Switches.elac2Sw.getValue();
sec1_sw = FBW.Switches.sec1Sw.getValue();
sec2_sw = FBW.Switches.sec2Sw.getValue();
sec3_sw = FBW.Switches.sec3Sw.getValue();
fac1_sw = FBW.Switches.fac1Sw.getValue();
fac2_sw = FBW.Switches.fac2Sw.getValue();
elac1_fail = FBW.Failures.elac1.getValue();
elac2_fail = FBW.Failures.elac2.getValue();
sec1_fail = FBW.Failures.sec1.getValue();
sec2_fail = FBW.Failures.sec2.getValue();
sec3_fail = FBW.Failures.sec3.getValue();
fac1_fail = FBW.Failures.fac1.getValue();
fac2_fail = FBW.Failures.fac2.getValue();
ac_ess = systems.ELEC.Bus.acEss.getValue();
dc_ess = systems.ELEC.Bus.dcEss.getValue();
dc_ess_shed = systems.ELEC.Bus.dcEssShed.getValue();
ac1 = systems.ELEC.Bus.ac1.getValue();
ac2 = systems.ELEC.Bus.ac2.getValue();
dc1 = systems.ELEC.Bus.dc1.getValue();
dc2 = systems.ELEC.Bus.dc2.getValue();
dcHot1 = systems.ELEC.Bus.dcHot1.getValue();
dcHot2 = systems.ELEC.Bus.dcHot2.getValue();
battery1_sw = systems.ELEC.Switch.bat1.getValue();
battery2_sw = systems.ELEC.Switch.bat2.getValue();
if (elac1_sw and !elac1_fail and (dc_ess >= 25 or dcHot1 >= 25)) {
FBW.Computers.elac1.setValue(1);
FBW.Lights.elac1.setValue(0);
} else if (elac1_sw and (elac1_fail or (dc_ess < 25 and dcHot1 < 25))) {
FBW.Computers.elac1.setValue(0);
FBW.Lights.elac1.setValue(1);
}
if (elac2_sw and !elac2_fail and (dc2 >= 25 or dcHot2 >= 25)) {
FBW.Computers.elac2.setValue(1);
FBW.Lights.elac2.setValue(0);
} else if (elac1_sw and (elac2_fail or (dc2 < 25 and dcHot2 < 25))) {
FBW.Computers.elac2.setValue(0);
FBW.Lights.elac2.setValue(1);
}
if (sec1_sw and !sec1_fail and dc_ess >= 25) {
setprop("systems/fctl/sec1", 1);
setprop("systems/failures/spoiler-l3", 0);
setprop("systems/failures/spoiler-r3", 0);
setprop("systems/failures/spoiler-l4", 0);
setprop("systems/failures/spoiler-r4", 0);
} else {
setprop("systems/fctl/sec1", 0);
setprop("systems/failures/spoiler-l3", 1);
setprop("systems/failures/spoiler-r3", 1);
setprop("systems/failures/spoiler-l4", 1);
setprop("systems/failures/spoiler-r4", 1);
}
if (sec2_sw and !sec2_fail and dc2 >= 25) {
setprop("systems/fctl/sec2", 1);
setprop("systems/failures/spoiler-l5", 0);
setprop("systems/failures/spoiler-r5", 0);
} else {
setprop("systems/fctl/sec2", 0);
setprop("systems/failures/spoiler-l5", 1);
setprop("systems/failures/spoiler-r5", 1);
}
if (sec3_sw and !sec3_fail and dc2 >= 25) {
setprop("systems/fctl/sec3", 1);
setprop("systems/failures/spoiler-l1", 0);
setprop("systems/failures/spoiler-r1", 0);
setprop("systems/failures/spoiler-l2", 0);
setprop("systems/failures/spoiler-r2", 0);
} else {
setprop("systems/fctl/sec3", 0);
setprop("systems/failures/spoiler-l1", 1);
setprop("systems/failures/spoiler-r1", 1);
setprop("systems/failures/spoiler-l2", 1);
setprop("systems/failures/spoiler-r2", 1);
}
if (fac1_sw and !fac1_fail and (ac_ess >= 110 or dc_ess_shed >= 25)) {
setprop("systems/fctl/fac1", 1);
setprop("systems/failures/rudder", 0);
setprop("systems/failures/fac1-fault", 0);
} else if (fac1_sw and (battery1_sw or battery2_sw) and (fac1_fail or ac_ess < 110 or dc_ess_shed < 25)) {
setprop("systems/failures/fac1-fault", 1);
setprop("systems/fctl/fac1", 0);
if (!fac2_sw or fac2_fail) {
setprop("systems/failures/rudder", 1);
}
} else {
setprop("systems/failures/fac1-fault", 0);
setprop("systems/fctl/fac1", 0);
if (!fac2_sw or fac2_fail) {
setprop("systems/failures/rudder", 1);
}
}
if (fac2_sw and !fac2_fail and (ac2 >= 110 or dc2 >= 25)) {
setprop("systems/fctl/fac2", 1);
setprop("systems/failures/fac2-fault", 0);
} else if (fac2_sw and (fac2_fail or ac2 < 110 or dc2 < 25)) {
setprop("systems/failures/fac2-fault", 1);
setprop("systems/fctl/fac2", 0);
if (!fac1_sw or fac1_fail) {
setprop("systems/failures/rudder", 1);
}
} else {
setprop("systems/fctl/fac2", 0);
setprop("systems/failures/fac2-fault", 0);
if (!fac1_sw or fac1_fail) {
setprop("systems/failures/rudder", 1);
}
}
var elac1 = getprop("systems/fctl/elac1");
var elac2 = getprop("systems/fctl/elac2");
var sec1 = getprop("systems/fctl/sec1");
var sec2 = getprop("systems/fctl/sec2");
var sec3 = getprop("systems/fctl/sec3");
var fac1 = getprop("systems/fctl/fac1");
var fac2 = getprop("systems/fctl/fac2");
elac1 = FBW.Computers.elac1.getBoolValue();
elac2 = FBW.Computers.elac2.getBoolValue();
sec1 = FBW.Computers.sec1.getBoolValue();
sec2 = FBW.Computers.sec2.getBoolValue();
sec3 = FBW.Computers.sec3.getBoolValue();
fac1 = FBW.Computers.fac1.getBoolValue();
fac2 = FBW.Computers.fac2.getBoolValue();
law = FBW.activeLaw.getValue();
# Degrade logic, all failures which degrade FBW need to go here. -JD
blue = systems.HYD.Psi.blue.getValue();
green = systems.HYD.Psi.green.getValue();
yellow = systems.HYD.Psi.yellow.getValue();
if (getprop("gear/gear[1]/wow") == 0 and getprop("gear/gear[2]/wow") == 0) {
if (!pts.Gear.wow[1].getBoolValue() and !pts.Gear.wow[2].getBoolValue()) {
if (!elac1 and !elac2) {
if (law == 0) {
FBW.degradeLaw.setValue(1);
@ -273,7 +147,7 @@ var update_loop = func {
fcu.athrOff("hard");
}
}
if (getprop("systems/electrical/some-electric-thingie/emer-elec-config") == 1) {
if (systems.ELEC.EmerElec.getBoolValue()) {
if (law == 0) {
FBW.degradeLaw.setValue(1);
fcu.apOff("hard", 0);
@ -287,14 +161,14 @@ var update_loop = func {
fcu.athrOff("hard");
}
}
if (dc_ess < 25 and dc2 < 25) {
if (systems.ELEC.Bus.dcEss.getValue() < 25 and systems.ELEC.Bus.dc2.getValue() < 25) {
FBW.degradeLaw.setValue(3);
fcu.apOff("hard", 0);
fcu.athrOff("hard");
}
}
if (getprop("controls/gear/gear-down") == 1 and getprop("it-autoflight/output/ap1") == 0 and getprop("it-autoflight/output/ap2") == 0) {
if (pts.Controls.Gear.gearDown.getBoolValue() and !fmgc.Input.ap1.getBoolValue() and !fmgc.Input.ap2.getBoolValue()) {
if (law == 1) {
FBW.degradeLaw.setValue(2);
}
@ -308,23 +182,24 @@ var update_loop = func {
FBW.degradeLaw.setValue(2);
}
mmoIAS = (getprop("instrumentation/airspeed-indicator/indicated-speed-kt") / getprop("instrumentation/airspeed-indicator/indicated-mach")) * 0.82;
cas = pts.Instrumentation.AirspeedIndicator.indicatedSpdKt.getValue();
mmoIAS = (cas / pts.Instrumentation.AirspeedIndicator.indicatedMach.getValue()) * 0.82;
if (mmoIAS < 350) {
setprop("it-fbw/speeds/vmo-mmo", mmoIAS);
fmgc.FMGCInternal.vmo_mmo = mmoIAS;
} else {
setprop("it-fbw/speeds/vmo-mmo", 350);
fmgc.FMGCInternal.vmo_mmo = 350;
}
if (getprop("instrumentation/airspeed-indicator/indicated-speed-kt") > getprop("it-fbw/speeds/vmo-mmo") + 6 and (law == 0 or law == 1)) {
if (getprop("it-autoflight/input/ap1") == 1 or getprop("it-autoflight/input/ap2") == 1) {
if (cas > (fmgc.FMGCInternal.vmo_mmo + 6) and (law == 0 or law == 1)) {
if (fmgc.Input.ap1.getBoolValue() or fmgc.Input.ap2.getBoolValue()) {
fcu.apOff("hard", 0);
}
if (getprop("it-fbw/protections/overspeed") != 1) {
setprop("it-fbw/protections/overspeed", 1);
if (!FBW.Protections.overspeed.getBoolValue()) {
FBW.Protections.overspeed.setBoolValue(1);
}
} else {
if (getprop("it-fbw/protections/overspeed") != 0) {
setprop("it-fbw/protections/overspeed", 0);
if (FBW.Protections.overspeed.getBoolValue()) {
FBW.Protections.overspeed.setBoolValue(0);
}
}
}
@ -361,7 +236,7 @@ var fbw_loop = func {
FBW.Protections.overspeedRoll.setValue(1);
}
if (getprop("it-fbw/override") == 0) {
if (!FBW.override.getBoolValue()) {
var active = FBW.activeLaw.getValue();
var degrade = FBW.degradeLaw.getValue();
if (degrade == 0) {
@ -384,12 +259,50 @@ var fbw_loop = func {
}
if (FBW.activeLaw.getValue() != 0) {
if (getprop("it-autoflight/output/ap1") == 1 or getprop("it-autoflight/output/ap2") == 1) {
if (fmgc.Input.ap1.getBoolValue() or fmgc.Input.ap2.getBoolValue()) {
fcu.apOff("hard", 0);
fcu.athrOff("hard");
}
}
}
setlistener("systems/fctl/sec1", func() {
if (FBW.Computers.sec1.getBoolValue()) {
FBW.Failures.spoilerl3.setBoolValue(0);
FBW.Failures.spoilerr3.setBoolValue(0);
FBW.Failures.spoilerl4.setBoolValue(0);
FBW.Failures.spoilerr4.setBoolValue(0);
} else {
FBW.Failures.spoilerl3.setBoolValue(1);
FBW.Failures.spoilerr3.setBoolValue(1);
FBW.Failures.spoilerl4.setBoolValue(1);
FBW.Failures.spoilerr4.setBoolValue(1);
}
}, 0, 0);
setlistener("systems/fctl/sec2", func() {
if (FBW.Computers.sec2.getBoolValue()) {
FBW.Failures.spoilerl5.setBoolValue(0);
FBW.Failures.spoilerr5.setBoolValue(0);
} else {
FBW.Failures.spoilerl5.setBoolValue(1);
FBW.Failures.spoilerr5.setBoolValue(1);
}
}, 0, 0);
setlistener("systems/fctl/sec3", func() {
if (FBW.Computers.sec3.getBoolValue()) {
FBW.Failures.spoilerl1.setBoolValue(0);
FBW.Failures.spoilerr1.setBoolValue(0);
FBW.Failures.spoilerl2.setBoolValue(0);
FBW.Failures.spoilerr2.setBoolValue(0);
} else {
FBW.Failures.spoilerl1.setBoolValue(1);
FBW.Failures.spoilerr1.setBoolValue(1);
FBW.Failures.spoilerl2.setBoolValue(1);
FBW.Failures.spoilerr2.setBoolValue(1);
}
}, 0, 0);
var updatet = maketimer(0.1, update_loop);
var fbwt = maketimer(0.03, fbw_loop);

View file

@ -71,8 +71,6 @@ var mng_spd_cmd = 0;
var kts_sel = 0;
var mach_sel = 0;
var srsSPD = 0;
var maxspeed = 0;
var minspeed = 0;
var mach_switchover = 0;
var decel = 0;
var mng_alt_spd_cmd = 0;
@ -93,8 +91,6 @@ var thr1 = 0;
var thr2 = 0;
var altsel = 0;
var crzFl = 0;
setprop("/FMGC/internal/maxspeed", 0);
setprop("/FMGC/internal/minspeed", 0);
setprop("position/gear-agl-ft", 0);
setprop("/FMGC/internal/mng-spd", 157);
setprop("/FMGC/internal/mng-spd-cmd", 157);
@ -113,9 +109,10 @@ setprop("/FMGC/internal/adf1-mcdu", "XXX/999.99");
setprop("/FMGC/internal/adf2-mcdu", "999.99/XXX");
var FMGCinit = func {
setprop("/FMGC/status/to-state", 0);
fmgc.FMGCInternal.takeoffState = 0;
fmgc.FMGCInternal.minspeed = 0;
fmgc.FMGCInternal.maxspeed = 338;
fmgc.FMGCInternal.phase = 0; # 0 is Preflight 1 is Takeoff 2 is Climb 3 is Cruise 4 is Descent 5 is Decel/Approach 6 is Go Around 7 is Done
setprop("/FMGC/internal/maxspeed", 338);
setprop("/FMGC/internal/mng-spd", 157);
setprop("/FMGC/internal/mng-spd-cmd", 157);
setprop("/FMGC/internal/mng-kts-mach", 0);
@ -137,6 +134,14 @@ var FMGCinit = func {
var FMGCInternal = {
# phase logic
phase: 0,
minspeed: 0,
maxspeed: 0,
takeoffState: 0,
# speeds
alpha_prot: 0,
alpha_max: 0,
vmo_mmo: 0,
# PERF
v1: 0,
@ -182,6 +187,7 @@ var FMGCNodes = {
toFromSet: props.globals.initNode("/FMGC/internal/tofrom-set", 0, "BOOL"),
v1: props.globals.initNode("/FMGC/internal/v1", 0, "DOUBLE"),
v1set: props.globals.initNode("/FMGC/internal/v1-set", 0, "BOOL"),
toState: props.globals.initNode("/FMGC/internal/to-state", 0, "BOOL"),
};
############
@ -194,7 +200,7 @@ setlistener("/gear/gear[0]/wow", func {
var trimReset = func {
flaps = getprop("/controls/flight/flaps-pos");
if (pts.Gear.wow[0].getBoolValue() and getprop("/FMGC/status/to-state") == 0 and (flaps >= 5 or (flaps >= 4 and getprop("/instrumentation/mk-viii/inputs/discretes/momentary-flap3-override") == 1))) {
if (pts.Gear.wow[0].getBoolValue() and !fmgc.FMGCInternal.takeoffState and (flaps >= 5 or (flaps >= 4 and getprop("/instrumentation/mk-viii/inputs/discretes/momentary-flap3-override") == 1))) {
interpolate("/controls/flight/elevator-trim", 0.0, 1.5);
}
}
@ -503,11 +509,11 @@ var masterFMGC = maketimer(0.2, func {
}
if (getprop("/systems/navigation/adr/computation/overspeed-vfe-spd") != 1024) {
setprop("/FMGC/internal/maxspeed", getprop("/systems/navigation/adr/computation/overspeed-vfe-spd") - 4);
fmgc.FMGCInternal.maxspeed = getprop("/systems/navigation/adr/computation/overspeed-vfe-spd") - 4;
} elsif (pts.Gear.position[0].getValue() != 0 or pts.Gear.position[1].getValue() != 0 or pts.Gear.position[2].getValue() != 0) {
setprop("/FMGC/internal/maxspeed", 284);
fmgc.FMGCInternal.maxspeed = 284;
} else {
setprop("/FMGC/internal/maxspeed", getprop("/it-fbw/speeds/vmo-mmo"));
fmgc.FMGCInternal.maxspeed = getprop("/it-fbw/speeds/vmo-mmo");
}
############################
@ -632,76 +638,83 @@ var masterFMGC = maketimer(0.2, func {
aoa = getprop("/systems/navigation/adr/output/aoa-1");
cas = getprop("/systems/navigation/adr/output/cas-1");
if (aoa > -5) {
alpha_prot = cas * math.sqrt((aoa - aoa_0)/(aoa_prot - aoa_0));
alpha_max = cas * math.sqrt((aoa - aoa_0)/(aoa_max - aoa_0));
fmgc.FMGCInternal.alpha_prot = cas * math.sqrt((aoa - aoa_0)/(aoa_prot - aoa_0));
fmgc.FMGCInternal.alpha_max = cas * math.sqrt((aoa - aoa_0)/(aoa_max - aoa_0));
} else {
alpha_prot = 0;
alpha_max = 0;
fmgc.FMGCInternal.alpha_prot = 0;
fmgc.FMGCInternal.alpha_max = 0;
}
setprop("/FMGC/internal/computed-speeds/alpha_prot", alpha_prot);
setprop("/FMGC/internal/computed-speeds/alpha_max", alpha_max);
setprop("/FMGC/internal/computed-speeds/vs1g_conf_2_appr", getprop("/FMGC/internal/computed-speeds/vs1g_conf_2"));
setprop("/FMGC/internal/computed-speeds/vs1g_conf_3_appr", getprop("/FMGC/internal/computed-speeds/vs1g_conf_3"));
setprop("/FMGC/internal/computed-speeds/vs1g_conf_full_appr", getprop("/FMGC/internal/computed-speeds/vs1g_conf_full"));
if (getprop("/FMGC/status/to-state") == 1) {
if (flap == 0) { # 0
if (flap == 0) { # 0
setprop("/FMGC/internal/computed-speeds/vsw", getprop("/FMGC/internal/computed-speeds/vs1g_clean"));
fmgc.FMGCInternal.minspeed = getprop("/FMGC/internal/computed-speeds/clean");
if (fmgc.FMGCInternal.takeoffState) {
setprop("/FMGC/internal/computed-speeds/vls_min", num(getprop("/FMGC/internal/computed-speeds/vs1g_clean")) * 1.28);
} else if (flap == 1) { # 1
setprop("/FMGC/internal/computed-speeds/vls_min", num(getprop("/FMGC/internal/computed-speeds/vs1g_conf_1")) * 1.23);
} else { # 1+F
setprop("/FMGC/internal/computed-speeds/vls_min", num(getprop("/FMGC/internal/computed-speeds/vs1g_clean")) * 1.13);
}
} else {
if (flap == 0) { # 0
} else {
setprop("/FMGC/internal/computed-speeds/vls_min", num(getprop("/FMGC/internal/computed-speeds/vs1g_clean")) * 1.23);
} else if (flap == 1) { # 1
setprop("/FMGC/internal/computed-speeds/vls_min", num(getprop("/FMGC/internal/computed-speeds/vs1g_conf_1")) * 1.23);
} else if (flap == 2) { # 1+F
}
} else if (flap == 1) { # 1
setprop("/FMGC/internal/computed-speeds/vsw", getprop("/FMGC/internal/computed-speeds/vs1g_conf_2"));
fmgc.FMGCInternal.minspeed = getprop("/FMGC/internal/computed-speeds/slat");
if (fmgc.FMGCInternal.takeoffState) {
setprop("/FMGC/internal/computed-speeds/vls_min", num(getprop("/FMGC/internal/computed-speeds/vs1g_conf_1")) * 1.28);
} else {
setprop("/FMGC/internal/computed-speeds/vls_min", num(getprop("/FMGC/internal/computed-speeds/vs1g_conf_1")) * 1.23);
}
} else if (flap == 2) { # 1+F
setprop("/FMGC/internal/computed-speeds/vsw", getprop("/FMGC/internal/computed-speeds/vs1g_conf_1f"));
fmgc.FMGCInternal.minspeed = getprop("/FMGC/internal/computed-speeds/slat");
if (fmgc.FMGCInternal.takeoffState) {
setprop("/FMGC/internal/computed-speeds/vls_min", num(getprop("/FMGC/internal/computed-speeds/vs1g_clean")) * 1.13);
} else {
setprop("/FMGC/internal/computed-speeds/vls_min", num(getprop("/FMGC/internal/computed-speeds/vs1g_conf_1f")) * 1.23);
} else if (flap == 3) { # 2
}
} else if (flap == 3) { # 2
setprop("/FMGC/internal/computed-speeds/vsw", getprop("/FMGC/internal/computed-speeds/vs1g_conf_2"));
fmgc.FMGCInternal.minspeed = getprop("/FMGC/internal/computed-speeds/flap2");
if (fmgc.FMGCInternal.takeoffState) {
setprop("/FMGC/internal/computed-speeds/vls_min", num(getprop("/FMGC/internal/computed-speeds/vs1g_clean")) * 1.13);
} else {
setprop("/FMGC/internal/computed-speeds/vls_min", num(getprop("/FMGC/internal/computed-speeds/vs1g_conf_2")) * 1.23);
} else if (flap == 4) { # 3
}
} else if (flap == 4) { # 3
setprop("/FMGC/internal/computed-speeds/vsw", getprop("/FMGC/internal/computed-speeds/vs1g_conf_3"));
fmgc.FMGCInternal.minspeed = getprop("/FMGC/internal/computed-speeds/flap3");
if (fmgc.FMGCInternal.takeoffState) {
setprop("/FMGC/internal/computed-speeds/vls_min", num(getprop("/FMGC/internal/computed-speeds/vs1g_clean")) * 1.13);
} else {
setprop("/FMGC/internal/computed-speeds/vls_min", num(getprop("/FMGC/internal/computed-speeds/vs1g_conf_3")) * 1.23);
} else if (flap == 5) { # FULL
}
} else if (flap == 5) { # FULL
setprop("/FMGC/internal/computed-speeds/vsw", getprop("/FMGC/internal/computed-speeds/vs1g_conf_full"));
fmgc.FMGCInternal.minspeed = getprop("/FMGC/internal/computed-speeds/vapp");
if (fmgc.FMGCInternal.takeoffState) {
setprop("/FMGC/internal/computed-speeds/vls_min", num(getprop("/FMGC/internal/computed-speeds/vs1g_clean")) * 1.13);
} else {
setprop("/FMGC/internal/computed-speeds/vls_min", num(getprop("/FMGC/internal/computed-speeds/vs1g_conf_full")) * 1.23);
}
}
if (flap == 0) { # 0
setprop("/FMGC/internal/computed-speeds/vsw", getprop("/FMGC/internal/computed-speeds/vs1g_clean"));
} else if (flap == 1) { # 1
setprop("/FMGC/internal/computed-speeds/vsw", getprop("/FMGC/internal/computed-speeds/vs1g_conf_2"));
} else if (flap == 2) { # 1+F
setprop("/FMGC/internal/computed-speeds/vsw", getprop("/FMGC/internal/computed-speeds/vs1g_conf_1f"));
} else if (flap == 3) { # 2
setprop("/FMGC/internal/computed-speeds/vsw", getprop("/FMGC/internal/computed-speeds/vs1g_conf_2"));
} else if (flap == 4) { # 3
setprop("/FMGC/internal/computed-speeds/vsw", getprop("/FMGC/internal/computed-speeds/vs1g_conf_3"));
} else if (flap == 5) { # FULL
setprop("/FMGC/internal/computed-speeds/vsw", getprop("/FMGC/internal/computed-speeds/vs1g_conf_full"));
}
if (flap == 0) { # 0
setprop("/FMGC/internal/minspeed", getprop("/FMGC/internal/computed-speeds/clean"));
} else if (flap == 1) { # 1
setprop("/FMGC/internal/minspeed", getprop("/FMGC/internal/computed-speeds/slat"));
} else if (flap == 2) { # 1+F
setprop("/FMGC/internal/minspeed", getprop("/FMGC/internal/computed-speeds/slat"));
} else if (flap == 3) { # 2
setprop("/FMGC/internal/minspeed", getprop("/FMGC/internal/computed-speeds/flap2"));
} else if (flap == 4) { # 3
setprop("/FMGC/internal/minspeed", getprop("/FMGC/internal/computed-speeds/flap3"));
} else if (flap == 5) { # FULL
setprop("/FMGC/internal/minspeed", getprop("/FMGC/internal/computed-speeds/vapp"));
}
if (gear0 and (state1 == "MCT" or state1 == "MAN THR" or state1 == "TOGA") and (state2 == "MCT" or state2 == "MAN THR" or state2 == "TOGA") and flaps < 5) {
setprop("/FMGC/status/to-state", 1);
}
if (pts.Position.gearAglFt.getValue() >= 55) {
setprop("/FMGC/status/to-state", 0);
if (gear0 and flaps < 5 and (state1 == "MCT" or state1 == "MAN THR" or state1 == "TOGA") and (state2 == "MCT" or state2 == "MAN THR" or state2 == "TOGA")) {
if (!fmgc.FMGCInternal.takeoffState) {
fmgc.FMGCNodes.toState.setValue(1);
}
fmgc.FMGCInternal.takeoffState = 1;
} elsif (pts.Position.gearAglFt.getValue() >= 55) {
if (fmgc.FMGCInternal.takeoffState) {
fmgc.FMGCNodes.toState.setValue(0);
}
fmgc.FMGCInternal.takeoffState = 0;
}
############################
@ -904,8 +917,6 @@ var ManagedSPD = maketimer(0.25, func {
srsSPD = getprop("/it-autoflight/settings/togaspd");
phase = fmgc.FMGCInternal.phase; # 0 is Preflight 1 is Takeoff 2 is Climb 3 is Cruise 4 is Descent 5 is Decel/Approach 6 is Go Around 7 is Done
flap = getprop("/controls/flight/flaps-pos");
maxspeed = getprop("/FMGC/internal/maxspeed");
minspeed = getprop("/FMGC/internal/minspeed");
mach_switchover = getprop("/FMGC/internal/mach-switchover");
decel = getprop("/FMGC/internal/decel");
@ -936,8 +947,8 @@ var ManagedSPD = maketimer(0.25, func {
}
if (mng_spd_cmd != 250 and !decel) {
setprop("/FMGC/internal/mng-spd-cmd", 250);
} else if (mng_spd_cmd != minspeed and decel) {
setprop("/FMGC/internal/mng-spd-cmd", minspeed);
} else if (mng_spd_cmd != fmgc.FMGCInternal.minspeed and decel) {
setprop("/FMGC/internal/mng-spd-cmd", fmgc.FMGCInternal.minspeed);
}
} else if ((FMGCInternal.phase == 2 or FMGCInternal.phase == 3) and altitude > 10070 and !mach_switchover) {
if (mngktsmach) {
@ -973,8 +984,8 @@ var ManagedSPD = maketimer(0.25, func {
}
if (mng_spd_cmd != mng_alt_spd and !decel) {
setprop("/FMGC/internal/mng-spd-cmd", mng_alt_spd);
} else if (mng_spd_cmd != minspeed and decel) {
setprop("/FMGC/internal/mng-spd-cmd", minspeed);
} else if (mng_spd_cmd != fmgc.FMGCInternal.minspeed and decel) {
setprop("/FMGC/internal/mng-spd-cmd", fmgc.FMGCInternal.minspeed);
}
} else if ((FMGCInternal.phase == 4 or FMGCInternal.phase == 5 or FMGCInternal.phase == 6) and altitude <= 10980) {
if (mngktsmach) {
@ -982,15 +993,15 @@ var ManagedSPD = maketimer(0.25, func {
}
if (mng_spd_cmd != 250 and !decel) {
setprop("/FMGC/internal/mng-spd-cmd", 250);
} else if (mng_spd_cmd != minspeed and decel) {
setprop("/FMGC/internal/mng-spd-cmd", minspeed);
} else if (mng_spd_cmd != fmgc.FMGCInternal.minspeed and decel) {
setprop("/FMGC/internal/mng-spd-cmd", fmgc.FMGCInternal.minspeed);
}
}
mng_spd_cmd = getprop("/FMGC/internal/mng-spd-cmd");
if (mng_spd_cmd > maxspeed -5) {
setprop("/FMGC/internal/mng-spd", maxspeed -5);
if (mng_spd_cmd > fmgc.FMGCInternal.maxspeed - 5) {
setprop("/FMGC/internal/mng-spd", fmgc.FMGCInternal.maxspeed - 5);
} else {
setprop("/FMGC/internal/mng-spd", mng_spd_cmd);
}

View file

@ -87,6 +87,7 @@ var Gear = {
var Instrumentation = {
AirspeedIndicator: {
indicatedSpdKt: props.globals.getNode("/instrumentation/airspeed-indicator/indicated-speed-kt"),
indicatedMach: props.globals.getNode("/instrumentation/airspeed-indicator/indicated-mach"),
},
Altimeter: {
indicatedFt: props.globals.getNode("/instrumentation/altimeter[0]/indicated-altitude-ft"),

View file

@ -15,6 +15,7 @@ var dc2 = 0;
var ELEC = {
_timer1On: 0,
_timer2On: 0,
EmerElec: props.globals.getNode("/systems/electrical/some-electric-thingie/emer-elec-config"),
Bus: {
acEss: props.globals.getNode("systems/electrical/bus/ac-ess"),
acEssShed: props.globals.getNode("systems/electrical/bus/ac-ess-shed"),

View file

@ -94,168 +94,6 @@ setlistener("/engines/engine[1]/state", func() {
}
}, 0, 0);
var FUELx = {
init: func() {
setprop("systems/fuel/gravityfeedL", 0);
setprop("systems/fuel/gravityfeedR", 0);
setprop("systems/fuel/gravityfeedL-output", 0);
setprop("systems/fuel/gravityfeedR-output", 0);
setprop("controls/fuel/x-feed", 0);
setprop("controls/fuel/tank0pump1", 0);
setprop("controls/fuel/tank0pump2", 0);
setprop("controls/fuel/tank1pump1", 0);
setprop("controls/fuel/tank1pump2", 0);
setprop("controls/fuel/tank2pump1", 0);
setprop("controls/fuel/tank2pump2", 0);
setprop("controls/fuel/mode", 1);
setprop("systems/fuel/valves/crossfeed-valve", 0);
setprop("systems/fuel/tank[0]/feed", 0);
setprop("systems/fuel/tank[1]/feed", 0);
setprop("systems/fuel/tank[2]/feed", 0);
setprop("systems/fuel/only-use-ctr-tank", 0);
setprop("systems/fuel/tank0pump1-fault", 0);
setprop("systems/fuel/tank0pump2-fault", 0);
setprop("systems/fuel/tank1pump1-fault", 0);
setprop("systems/fuel/tank1pump2-fault", 0);
setprop("systems/fuel/tank2pump1-fault", 0);
setprop("systems/fuel/tank2pump2-fault", 0);
setprop("systems/fuel/mode-fault", 0);
},
loop: func() {
xfeed_sw = getprop("controls/fuel/x-feed");
tank0pump1_sw = getprop("controls/fuel/tank0pump1");
tank0pump2_sw = getprop("controls/fuel/tank0pump2");
tank1pump1_sw = getprop("controls/fuel/tank1pump1");
tank1pump2_sw = getprop("controls/fuel/tank1pump2");
tank2pump1_sw = getprop("controls/fuel/tank2pump1");
tank2pump2_sw = getprop("controls/fuel/tank2pump2");
mode_sw = getprop("controls/fuel/mode");
xfeed = getprop("systems/fuel/valves/crossfeed-valve");
ac1 = getprop("systems/electrical/bus/ac-1");
ac2 = getprop("systems/electrical/bus/ac-2");
gravityfeedL = getprop("systems/fuel/gravityfeedL");
gravityfeedR = getprop("systems/fuel/gravityfeedR");
gload = getprop("accelerations/pilot-gdamped");
tank0pump1_fail = getprop("systems/failures/tank0pump1");
tank0pump2_fail = getprop("systems/failures/tank0pump2");
tank1pump1_fail = getprop("systems/failures/tank1pump1");
tank1pump2_fail = getprop("systems/failures/tank1pump2");
tank2pump1_fail = getprop("systems/failures/tank2pump1");
tank2pump2_fail = getprop("systems/failures/tank2pump2");
if (gload >= 0.7 and gravityfeedL) {
setprop("systems/fuel/gravityfeedL-output", 1);
} else {
setprop("systems/fuel/gravityfeedL-output", 0);
}
if (gload >= 0.7 and gravityfeedR) {
setprop("systems/fuel/gravityfeedR-output", 1);
} else {
setprop("systems/fuel/gravityfeedR-output", 0);
}
gravityfeedL_output = getprop("systems/fuel/gravityfeedL-output");
gravityfeedR_output = getprop("systems/fuel/gravityfeedR-output");
if ((ac1 >= 110 or ac2 >= 110) and tank0pump1_sw and !tank0pump1_fail) {
setprop("systems/fuel/tank[0]/feed", 1);
} else if ((ac1 >= 110 or ac2 >= 110) and tank0pump2_sw and !tank0pump2_fail) {
setprop("systems/fuel/tank[0]/feed", 1);
} else if (gravityfeedL_output) {
setprop("systems/fuel/tank[0]/feed", 1);
} else {
setprop("systems/fuel/tank[0]/feed", 0);
}
if ((ac1 >= 110 or ac2 >= 110) and tank1pump1_sw and !tank1pump1_fail) {
setprop("systems/fuel/tank[1]/feed", 1);
} else if ((ac1 >= 110 or ac2 >= 110) and tank1pump2_sw and !tank1pump2_fail) {
setprop("systems/fuel/tank[1]/feed", 1);
} else {
setprop("systems/fuel/tank[1]/feed", 0);
}
if ((ac1 >= 110 or ac2 >= 110) and tank2pump1_sw and !tank2pump1_fail) {
setprop("systems/fuel/tank[2]/feed", 1);
} else if ((ac1 >= 110 or ac2 >= 110) and tank2pump2_sw and !tank2pump2_fail) {
setprop("systems/fuel/tank[2]/feed", 1);
} else if (gravityfeedR_output) {
setprop("systems/fuel/tank[2]/feed", 1);
} else {
setprop("systems/fuel/tank[2]/feed", 0);
}
if ((ac1 >= 110 or ac2 >= 110) and xfeed_sw) {
setprop("systems/fuel/valves/crossfeed-valve", 1);
} else {
setprop("systems/fuel/valves/crossfeed-valve", 0);
}
tank0 = getprop("systems/fuel/tank[0]/feed");
tank1 = getprop("systems/fuel/tank[1]/feed");
tank2 = getprop("systems/fuel/tank[2]/feed");
if ((ac1 >= 110 or ac2 >= 110) and (tank0pump1_sw or tank0pump2_sw)) {
setprop("systems/fuel/gravityfeedL", 0);
} else {
setprop("systems/fuel/gravityfeedL", 1);
}
if ((ac1 >= 110 or ac2 >= 110) and (tank2pump1_sw or tank2pump2_sw)) {
setprop("systems/fuel/gravityfeedR", 0);
} else {
setprop("systems/fuel/gravityfeedR", 1);
}
gravityfeedL = getprop("systems/fuel/gravityfeedL");
gravityfeedR = getprop("systems/fuel/gravityfeedR");
if ((getprop("fdm/jsbsim/propulsion/tank[1]/contents-lbs") >= 50) and (tank1pump1_sw or tank1pump2_sw) and !gravityfeedL and !gravityfeedR) {
setprop("systems/fuel/only-use-ctr-tank", 1);
} else {
setprop("systems/fuel/only-use-ctr-tank", 0);
}
# Fault lights
if (tank0pump1_sw and tank0pump1_fail) {
setprop("systems/fuel/tank0pump1-fault", 1);
} else {
setprop("systems/fuel/tank0pump1-fault", 0);
}
if (tank0pump2_sw and tank0pump2_fail) {
setprop("systems/fuel/tank0pump2-fault", 1);
} else {
setprop("systems/fuel/tank0pump2-fault", 0);
}
if (tank1pump1_sw and tank1pump1_fail) {
setprop("systems/fuel/tank1pump1-fault", 1);
} else {
setprop("systems/fuel/tank1pump1-fault", 0);
}
if (tank1pump2_sw and tank1pump2_fail) {
setprop("systems/fuel/tank1pump2-fault", 1);
} else {
setprop("systems/fuel/tank1pump2-fault", 0);
}
if (tank2pump1_sw and tank2pump1_fail) {
setprop("systems/fuel/tank2pump1-fault", 1);
} else {
setprop("systems/fuel/tank2pump1-fault", 0);
}
if (tank2pump2_sw and tank2pump2_fail) {
setprop("systems/fuel/tank2pump2-fault", 1);
} else {
setprop("systems/fuel/tank2pump2-fault", 0);
}
},
};
var ctrTkTimer = maketimer(0.5, func() {
if (pts.Sim.Time.elapsedSec.getValue() > (FUEL.timeEngStart + 120)) {
FUEL.cmdCtrOn.setValue(0);

View file

@ -165,7 +165,7 @@
<value>1</value>
</equals>
<equals>
<property>/FMGC/status/to-state</property>
<property>/FMGC/internal/to-state</property>
<value>1</value>
</equals>
</and>

View file

@ -248,6 +248,148 @@
</channel>
<channel name="Computers">
<switch name="/systems/fctl/lights/elac1-fault">
<default value="0"/>
<test logic="AND" value="1">
/controls/fctl/switches/elac1 eq 1
/systems/fctl/elac1 eq 0
</test>
</switch>
<switch name="/systems/fctl/elac1">
<default value="0"/>
<test logic="AND" value="1">
/controls/fctl/switches/elac1 eq 1
/systems/failures/fctl/elac1 eq 0
<test logic="OR">
/systems/electrical/bus/dc-ess ge 25
/systems/electrical/bus/dc-hot-1 ge 25
</test>
</test>
</switch>
<switch name="/systems/fctl/lights/elac2-fault">
<default value="0"/>
<test logic="AND" value="1">
/controls/fctl/switches/elac2 eq 1
/systems/fctl/elac2 eq 0
</test>
</switch>
<switch name="/systems/fctl/elac2">
<default value="0"/>
<test logic="AND" value="1">
/controls/fctl/switches/elac2 eq 1
/systems/failures/fctl/elac2 eq 0
<test logic="OR">
/systems/electrical/bus/dc-2 ge 25
/systems/electrical/bus/dc-hot-2 ge 25
</test>
</test>
</switch>
<switch name="/systems/fctl/lights/sec1-fault">
<default value="0"/>
<test logic="AND" value="1">
/controls/fctl/switches/sec1 eq 1
/systems/fctl/sec1 eq 0
</test>
</switch>
<switch name="/systems/fctl/sec1">
<default value="0"/>
<test logic="AND" value="1">
/controls/fctl/switches/sec1 eq 1
/systems/failures/fctl/sec1 eq 0
<test logic="OR">
/systems/electrical/bus/dc-ess ge 25
/systems/electrical/bus/dc-hot-1 ge 25
</test>
</test>
</switch>
<switch name="/systems/fctl/lights/sec2-fault">
<default value="0"/>
<test logic="AND" value="1">
/controls/fctl/switches/sec2 eq 1
/systems/fctl/sec2 eq 0
</test>
</switch>
<switch name="/systems/fctl/sec2">
<default value="0"/>
<test logic="AND" value="1">
/controls/fctl/switches/sec2 eq 1
/systems/failures/fctl/sec2 eq 0
/systems/electrical/bus/dc-2 ge 25
</test>
</switch>
<switch name="/systems/fctl/lights/sec3-fault">
<default value="0"/>
<test logic="AND" value="1">
/controls/fctl/switches/sec3 eq 1
/systems/fctl/sec3 eq 0
</test>
</switch>
<switch name="/systems/fctl/sec3">
<default value="0"/>
<test logic="AND" value="1">
/controls/fctl/switches/sec3 eq 1
/systems/failures/fctl/sec3 eq 0
/systems/electrical/bus/dc-2 ge 25
</test>
</switch>
<switch name="/systems/fctl/lights/fac1-fault">
<default value="0"/>
<test logic="AND" value="1">
/controls/fctl/switches/fac1 eq 1
/systems/fctl/fac1 eq 0
</test>
</switch>
<switch name="/systems/fctl/fac1">
<default value="0"/>
<test logic="AND" value="1">
/controls/fctl/switches/fac1 eq 1
/systems/failures/fctl/fac1 eq 0
/systems/electrical/bus/ac-ess ge 110
/systems/electrical/bus/dc-ess-shed ge 25
</test>
</switch>
<switch name="/systems/fctl/lights/fac2-fault">
<default value="0"/>
<test logic="AND" value="1">
/controls/fctl/switches/fac2 eq 1
/systems/fctl/fac2 eq 0
</test>
</switch>
<switch name="/systems/fctl/fac2">
<default value="0"/>
<test logic="AND" value="1">
/controls/fctl/switches/fac2 eq 1
/systems/failures/fctl/fac2 eq 0
/systems/electrical/bus/ac-2 ge 110
/systems/electrical/bus/dc-2 ge 25
</test>
</switch>
<switch name="/systems/failures/rudder">
<default value="0"/>
<test logic="AND" value="1">
/systems/fctl/fac1 eq 0
/systems/fctl/fac2 eq 0
</test>
</switch>
</channel>
<channel name="FBW: Roll">
<switch name="fbw/roll/a-i-f">
@ -737,7 +879,7 @@
/controls/flight/flaps-pos ge 4
/controls/engines/engine[0]/throttle lt 0.65
/controls/engines/engine[1]/throttle lt 0.65
/FMGC/status/to-state eq 0
/FMGC/internal/to-state eq 0
/it-fbw/law eq 0
position/wow eq 0
</test>
@ -747,7 +889,7 @@
/controls/flight/flaps-pos ge 4
/controls/engines/engine[0]/throttle lt 0.65
/controls/engines/engine[1]/throttle lt 0.65
/FMGC/status/to-state eq 0
/FMGC/internal/to-state eq 0
/it-fbw/law eq 0
gear/unit[0]/WOW eq 0
fbw/pitch/flare-gear-switch eq 1

View file

@ -791,5 +791,30 @@
<output>propulsion/tank[7]/external-flow-rate-pps</output>
</summer>
</channel>
<channel name="Warnings">
<summer name="/systems/fuel/quantity/left-wing-kg">
<input>/consumables/fuel/tank[0]/level-kg</input>
<input>/consumables/fuel/tank[1]/level-kg</input>
</summer>
<summer name="/systems/fuel/quantity/right-wing-kg">
<input>/consumables/fuel/tank[3]/level-kg</input>
<input>/consumables/fuel/tank[4]/level-kg</input>
</summer>
<switch name="/systems/fuel/mode-fault">
<default value="0"/>
<test logic="AND" value="1">
<test logic="OR">
/systems/fuel/quantity/left-wing-kg lt 5000
/systems/fuel/quantity/right-wing-kg lt 5000
</test>
/consumables/fuel/tank[2]/level-kg ge 250
</test>
</switch>
</channel>
</system>

View file

@ -112,7 +112,7 @@
<test logic="AND" value="spoilers/main-cmd">
/systems/hydraulic/green-psi ge 1500
spoilers/main-gear-and eq 1
/systems/failures/spoiler-l1 eq 0
/systems/failures/spoilers/spoiler-l1 eq 0
</test>
<clipto>
<min>0.0</min>
@ -199,18 +199,18 @@
<test logic="AND" value="hydraulics/spoiler-l2/air-extended">
/systems/hydraulic/yellow-psi ge 1500
spoilers/main-gear-and eq 0
/systems/failures/spoiler-l2 eq 0
/systems/failures/spoilers/spoiler-l2 eq 0
spoilers/main-cmd gt 0
</test>
<test logic="AND" value="hydraulics/spoiler-l2/ground-extended">
/systems/hydraulic/yellow-psi ge 1500
spoilers/main-gear-and eq 1
/systems/failures/spoiler-l2 eq 0
/systems/failures/spoilers/spoiler-l2 eq 0
spoilers/main-cmd gt 0
</test>
<test logic="AND" value="hydraulics/spoiler-l2/retracted">
/systems/hydraulic/yellow-psi ge 1500
/systems/failures/spoiler-l2 eq 0
/systems/failures/spoilers/spoiler-l2 eq 0
spoilers/main-cmd eq 0
</test>
<clipto>
@ -266,12 +266,12 @@
<default value="0"/>
<test logic="AND" value="hydraulics/spoiler-l3/extended">
/systems/hydraulic/blue-psi ge 1500
/systems/failures/spoiler-l3 eq 0
/systems/failures/spoilers/spoiler-l3 eq 0
spoilers/main-cmd gt 0
</test>
<test logic="AND" value="hydraulics/spoiler-l3/retracted">
/systems/hydraulic/blue-psi ge 1500
/systems/failures/spoiler-l3 eq 0
/systems/failures/spoilers/spoiler-l3 eq 0
spoilers/main-cmd eq 0
</test>
<clipto>
@ -327,12 +327,12 @@
<default value="0"/>
<test logic="AND" value="hydraulics/spoiler-l4/extended">
/systems/hydraulic/yellow-psi ge 1500
/systems/failures/spoiler-l4 eq 0
/systems/failures/spoilers/spoiler-l4 eq 0
spoilers/main-cmd gt 0
</test>
<test logic="AND" value="hydraulics/spoiler-l4/retracted">
/systems/hydraulic/yellow-psi ge 1500
/systems/failures/spoiler-l4 eq 0
/systems/failures/spoilers/spoiler-l4 eq 0
spoilers/main-cmd eq 0
</test>
<clipto>
@ -389,12 +389,12 @@
<test logic="AND" value="hydraulics/spoiler-l5/ground-extended">
/systems/hydraulic/green-psi ge 1500
spoilers/main-gear-and eq 1
/systems/failures/spoiler-l5 eq 0
/systems/failures/spoilers/spoiler-l5 eq 0
spoilers/main-cmd gt 0
</test>
<test logic="AND" value="hydraulics/spoiler-l5/retracted">
/systems/hydraulic/green-psi ge 1500
/systems/failures/spoiler-l5 eq 0
/systems/failures/spoilers/spoiler-l5 eq 0
spoilers/main-cmd eq 0
</test>
<clipto>
@ -424,7 +424,7 @@
<test logic="AND" value="spoilers/main-cmd">
/systems/hydraulic/green-psi ge 1500
spoilers/main-gear-and eq 1
/systems/failures/spoiler-r1 eq 0
/systems/failures/spoilers/spoiler-r1 eq 0
</test>
<clipto>
<min>0.0</min>
@ -511,18 +511,18 @@
<test logic="AND" value="hydraulics/spoiler-r2/air-extended">
/systems/hydraulic/yellow-psi ge 1500
spoilers/main-gear-and eq 0
/systems/failures/spoiler-r2 eq 0
/systems/failures/spoilers/spoiler-r2 eq 0
spoilers/main-cmd gt 0
</test>
<test logic="AND" value="hydraulics/spoiler-r2/ground-extended">
/systems/hydraulic/yellow-psi ge 1500
spoilers/main-gear-and eq 1
/systems/failures/spoiler-r2 eq 0
/systems/failures/spoilers/spoiler-r2 eq 0
spoilers/main-cmd gt 0
</test>
<test logic="AND" value="hydraulics/spoiler-r2/retracted">
/systems/hydraulic/yellow-psi ge 1500
/systems/failures/spoiler-r2 eq 0
/systems/failures/spoilers/spoiler-r2 eq 0
spoilers/main-cmd eq 0
</test>
<clipto>
@ -578,12 +578,12 @@
<default value="0"/>
<test logic="AND" value="hydraulics/spoiler-r3/extended">
/systems/hydraulic/blue-psi ge 1500
/systems/failures/spoiler-r3 eq 0
/systems/failures/spoilers/spoiler-r3 eq 0
spoilers/main-cmd gt 0
</test>
<test logic="AND" value="hydraulics/spoiler-r3/retracted">
/systems/hydraulic/blue-psi ge 1500
/systems/failures/spoiler-r3 eq 0
/systems/failures/spoilers/spoiler-r3 eq 0
spoilers/main-cmd eq 0
</test>
<clipto>
@ -639,12 +639,12 @@
<default value="0"/>
<test logic="AND" value="hydraulics/spoiler-r4/extended">
/systems/hydraulic/yellow-psi ge 1500
/systems/failures/spoiler-r4 eq 0
/systems/failures/spoilers/spoiler-r4 eq 0
spoilers/main-cmd gt 0
</test>
<test logic="AND" value="hydraulics/spoiler-r4/retracted">
/systems/hydraulic/yellow-psi ge 1500
/systems/failures/spoiler-r4 eq 0
/systems/failures/spoilers/spoiler-r4 eq 0
spoilers/main-cmd eq 0
</test>
<clipto>
@ -701,12 +701,12 @@
<test logic="AND" value="hydraulics/spoiler-r5/ground-extended">
/systems/hydraulic/green-psi ge 1500
spoilers/main-gear-and eq 1
/systems/failures/spoiler-r5 eq 0
/systems/failures/spoilers/spoiler-r5 eq 0
spoilers/main-cmd gt 0
</test>
<test logic="AND" value="hydraulics/spoiler-r5/retracted">
/systems/hydraulic/green-psi ge 1500
/systems/failures/spoiler-r5 eq 0
/systems/failures/spoilers/spoiler-r5 eq 0
spoilers/main-cmd eq 0
</test>
<clipto>