1
0
Fork 0

Merge branch 'dev' into 3D

This commit is contained in:
Jonathan Redpath 2021-10-27 18:34:36 +01:00
commit 6bf96d5407
10 changed files with 293 additions and 85 deletions

View file

@ -238,13 +238,7 @@ var canvas_pfd = {
} else { } else {
obj["AI_agl"].setText(sprintf("%s", math.round(math.clamp(val, 0, 2500)))); obj["AI_agl"].setText(sprintf("%s", math.round(math.clamp(val, 0, 2500))));
} }
obj["ground_ref"].setTranslation(0, (-val / 100) * -48.66856);
if (-val >= -565 and -val <= 565) {
obj["ground_ref"].setTranslation(0, (-val / 100) * -48.66856);
obj["ground_ref"].show();
} else {
obj["ground_ref"].hide();
}
}), }),
props.UpdateManager.FromHashList(["agl","gear1Wow", "gear2Wow","fmgcPhase"], nil, func(val) { props.UpdateManager.FromHashList(["agl","gear1Wow", "gear2Wow","fmgcPhase"], nil, func(val) {
if (-val.agl >= -565 and -val.agl <= 565) { if (-val.agl >= -565 and -val.agl <= 565) {
@ -1188,6 +1182,13 @@ var canvas_pfd = {
me["ASI_trend_up"].hide(); me["ASI_trend_up"].hide();
me["ASI_trend_down"].hide(); me["ASI_trend_down"].hide();
} }
if (-notification.agl >= -565 and -notification.agl <= 565) {
me["ground_ref"].show();
} else {
me["ground_ref"].hide();
}
} else { } else {
me["ASI_group"].hide(); me["ASI_group"].hide();
me["ASI_error"].show(); me["ASI_error"].show();

View file

@ -37,6 +37,7 @@ var alt200 = nil;
var alt750 = nil; var alt750 = nil;
var bigThree = nil; var bigThree = nil;
var fltCtlLandAsap = 0; var fltCtlLandAsap = 0;
var gearPosition = nil;
var altAlertSteady = 0; var altAlertSteady = 0;
var altAlertFlash = 0; var altAlertFlash = 0;
@ -2057,10 +2058,11 @@ var messages_priority_2 = func {
ECAM_controller.warningReset(fctlSpdBrkStillOut); ECAM_controller.warningReset(fctlSpdBrkStillOut);
} }
gearPosition = pts.Gear.position[1].getValue();
if (directLaw.clearFlag == 0 and warningNodes.Timers.directLaw.getValue() and phaseVar2 != 4 and phaseVar2 != 5 and phaseVar2 != 7 and phaseVar2 != 8) { if (directLaw.clearFlag == 0 and warningNodes.Timers.directLaw.getValue() and phaseVar2 != 4 and phaseVar2 != 5 and phaseVar2 != 7 and phaseVar2 != 8) {
directLaw.active = 1; directLaw.active = 1;
directLawProt.active = 1; directLawProt.active = 1;
if (directLawMaxSpeed.clearFlag == 0 and !fbw.tripleADRFail and pts.Gear.position[1].getValue() == 1) { if (directLawMaxSpeed.clearFlag == 0 and !fbw.tripleADRFail and gearPosition != 1) {
directLawMaxSpeed.active = 1; directLawMaxSpeed.active = 1;
} else { } else {
ECAM_controller.warningReset(directLawMaxSpeed); ECAM_controller.warningReset(directLawMaxSpeed);
@ -2070,12 +2072,12 @@ var messages_priority_2 = func {
} else { } else {
ECAM_controller.warningReset(directLawTrim); ECAM_controller.warningReset(directLawTrim);
} }
if (directLawCare.clearFlag == 0 and (fbw.tripleADRFail or pts.Gear.position[1].getValue() == 1)) { if (directLawCare.clearFlag == 0 and (fbw.tripleADRFail or gearPosition != 1)) {
directLawCare.active = 1; directLawCare.active = 1;
} else { } else {
ECAM_controller.warningReset(directLawCare); ECAM_controller.warningReset(directLawCare);
} }
if (directLawSpdBrk.clearFlag == 0 and !fbw.tripleADRFail and pts.Gear.position[1].getValue() == 1) { if (directLawSpdBrk.clearFlag == 0 and !fbw.tripleADRFail and gearPosition != 1) {
directLawSpdBrk.active = 1; directLawSpdBrk.active = 1;
} else { } else {
ECAM_controller.warningReset(directLawSpdBrk); ECAM_controller.warningReset(directLawSpdBrk);
@ -2111,7 +2113,13 @@ var messages_priority_2 = func {
ECAM_controller.warningReset(altnLawMaxSpeed2); ECAM_controller.warningReset(altnLawMaxSpeed2);
} }
if (altnLawMaxSpdBrk.clearFlag == 0 and (fbw.tripleADRFail or warningNodes.Logic.leftElevFail.getValue() or warningNodes.Logic.rightElevFail.getValue())) { if (altnLawCare.clearFlag == 0 and (fbw.tripleADRFail or gearPosition != 1)) {
altnLawCare.active = 1;
} else {
ECAM_controller.warningReset(altnLawCare);
}
if (altnLawMaxSpdBrk.clearFlag == 0 and (fbw.tripleADRFail or warningNodes.Logic.leftElevFail.getValue() or warningNodes.Logic.rightElevFail.getValue() or warningNodes.Logic.leftElevNotAvail.getValue())) {
altnLawMaxSpdBrk.active = 1; altnLawMaxSpdBrk.active = 1;
} else { } else {
ECAM_controller.warningReset(altnLawMaxSpdBrk); ECAM_controller.warningReset(altnLawMaxSpdBrk);
@ -2121,6 +2129,7 @@ var messages_priority_2 = func {
ECAM_controller.warningReset(altnLawProt); ECAM_controller.warningReset(altnLawProt);
ECAM_controller.warningReset(altnLawMaxSpeed); ECAM_controller.warningReset(altnLawMaxSpeed);
ECAM_controller.warningReset(altnLawMaxSpeed2); ECAM_controller.warningReset(altnLawMaxSpeed2);
ECAM_controller.warningReset(altnLawCare);
ECAM_controller.warningReset(altnLawMaxSpdBrk); ECAM_controller.warningReset(altnLawMaxSpdBrk);
} }
@ -2237,31 +2246,7 @@ var messages_priority_2 = func {
ECAM_controller.warningReset(fac2FaultFacOff); ECAM_controller.warningReset(fac2FaultFacOff);
} }
if (yawDamper1Fault.clearFlag == 0 and (phaseVar2 <= 2 or phaseVar2 == 9 or phaseVar2 == 6) and warningNodes.Timers.yawDamper1Fault.getValue() == 1 and !warningNodes.Logic.yawDamper12Fault.getBoolValue()) { if (fcu.FCUController.FCU1.failed and fcu.FCUController.FCU2.failed and systems.ELEC.Bus.dcEss.getValue() >= 25 and systems.ELEC.Bus.dc2.getValue() >= 25 and fcuFault.clearFlag == 0) {
yawDamper1Fault.active = 1;
} else {
ECAM_controller.warningReset(yawDamper1Fault);
}
if (yawDamper2Fault.clearFlag == 0 and (phaseVar2 <= 2 or phaseVar2 == 9 or phaseVar2 == 6) and warningNodes.Timers.yawDamper2Fault.getValue() == 1 and !warningNodes.Logic.yawDamper12Fault.getBoolValue()) {
yawDamper2Fault.active = 1;
} else {
ECAM_controller.warningReset(yawDamper2Fault);
}
if (rudTravLimSys1Fault.clearFlag == 0 and (phaseVar2 <= 2 or phaseVar2 >= 9 or phaseVar2 == 6) and warningNodes.Logic.rtlu1Fault.getBoolValue()) {
rudTravLimSys1Fault.active = 1;
} else {
ECAM_controller.warningReset(rudTravLimSys1Fault);
}
if (rudTravLimSys2Fault.clearFlag == 0 and (phaseVar2 <= 2 or phaseVar2 >= 9 or phaseVar2 == 6) and warningNodes.Logic.rtlu2Fault.getBoolValue()) {
rudTravLimSys2Fault.active = 1;
} else {
ECAM_controller.warningReset(rudTravLimSys2Fault);
}
if (fcu.FCUController.FCU1.failed and fcu.FCUController.FCU2.failed and systems.ELEC.Bus.dcEss.getValue() >= 25 and systems.ELEC.Bus.dcEss.getValue() >= 25 and fcuFault.clearFlag == 0) {
fcuFault.active = 1; fcuFault.active = 1;
fcuFaultBaro.active = 1; fcuFaultBaro.active = 1;
} else { } else {
@ -2269,22 +2254,6 @@ var messages_priority_2 = func {
ECAM_controller.warningReset(fcuFaultBaro); ECAM_controller.warningReset(fcuFaultBaro);
} }
if (fcu.FCUController.FCU1.failed and !fcu.FCUController.FCU2.failed and systems.ELEC.Bus.dcEss.getValue() >= 25 and fcuFault1.clearFlag == 0) {
fcuFault1.active = 1;
fcuFault1Baro.active = 1;
} else {
ECAM_controller.warningReset(fcuFault1);
ECAM_controller.warningReset(fcuFault1Baro);
}
if (fcu.FCUController.FCU2.failed and !fcu.FCUController.FCU1.failed and systems.ELEC.Bus.dc2.getValue() >= 25 and fcuFault2.clearFlag == 0) {
fcuFault2.active = 1;
fcuFault2Baro.active = 1;
} else {
ECAM_controller.warningReset(fcuFault2);
ECAM_controller.warningReset(fcuFault2Baro);
}
# FUEL # FUEL
if (wingLoLvl.clearFlag == 0 and warningNodes.Timers.lowLevelBoth.getValue() == 1 and (phaseVar2 <= 2 or phaseVar2 == 6 or phaseVar2 >= 9)) { if (wingLoLvl.clearFlag == 0 and warningNodes.Timers.lowLevelBoth.getValue() == 1 and (phaseVar2 <= 2 or phaseVar2 == 6 or phaseVar2 >= 9)) {
wingLoLvl.active = 1; wingLoLvl.active = 1;
@ -3018,6 +2987,46 @@ var messages_priority_2 = func {
ECAM_controller.warningReset(wingIceOpenGndShut); ECAM_controller.warningReset(wingIceOpenGndShut);
} }
if (yawDamper1Fault.clearFlag == 0 and (phaseVar2 <= 2 or phaseVar2 == 9 or phaseVar2 == 6) and warningNodes.Timers.yawDamper1Fault.getValue() == 1 and !warningNodes.Logic.yawDamper12Fault.getBoolValue()) {
yawDamper1Fault.active = 1;
} else {
ECAM_controller.warningReset(yawDamper1Fault);
}
if (yawDamper2Fault.clearFlag == 0 and (phaseVar2 <= 2 or phaseVar2 == 9 or phaseVar2 == 6) and warningNodes.Timers.yawDamper2Fault.getValue() == 1 and !warningNodes.Logic.yawDamper12Fault.getBoolValue()) {
yawDamper2Fault.active = 1;
} else {
ECAM_controller.warningReset(yawDamper2Fault);
}
if (rudTravLimSys1Fault.clearFlag == 0 and (phaseVar2 <= 2 or phaseVar2 >= 9 or phaseVar2 == 6) and warningNodes.Logic.rtlu1Fault.getBoolValue()) {
rudTravLimSys1Fault.active = 1;
} else {
ECAM_controller.warningReset(rudTravLimSys1Fault);
}
if (rudTravLimSys2Fault.clearFlag == 0 and (phaseVar2 <= 2 or phaseVar2 >= 9 or phaseVar2 == 6) and warningNodes.Logic.rtlu2Fault.getBoolValue()) {
rudTravLimSys2Fault.active = 1;
} else {
ECAM_controller.warningReset(rudTravLimSys2Fault);
}
if (fcu.FCUController.FCU1.failed and !fcu.FCUController.FCU2.failed and systems.ELEC.Bus.dcEss.getValue() >= 25 and fcuFault1.clearFlag == 0) {
fcuFault1.active = 1;
fcuFault1Baro.active = 1;
} else {
ECAM_controller.warningReset(fcuFault1);
ECAM_controller.warningReset(fcuFault1Baro);
}
if (fcu.FCUController.FCU2.failed and !fcu.FCUController.FCU1.failed and systems.ELEC.Bus.dc2.getValue() >= 25 and fcuFault2.clearFlag == 0) {
fcuFault2.active = 1;
fcuFault2Baro.active = 1;
} else {
ECAM_controller.warningReset(fcuFault2);
ECAM_controller.warningReset(fcuFault2Baro);
}
if (wingIceLHiPr.clearFlag == 0 and warningNodes.Timers.waiLhiPr.getValue() == 1 and (phaseVar2 <= 2 or phaseVar2 >= 9 or phaseVar2 == 6)) { if (wingIceLHiPr.clearFlag == 0 and warningNodes.Timers.waiLhiPr.getValue() == 1 and (phaseVar2 <= 2 or phaseVar2 >= 9 or phaseVar2 == 6)) {
wingIceLHiPr.active = 1; wingIceLHiPr.active = 1;
wingIceLHiPrThrust.active = 1; wingIceLHiPrThrust.active = 1;

View file

@ -233,7 +233,7 @@ var ECAMRecipient =
if (math.mod(notifications.frameNotification.FrameCount,10) == 0) { if (math.mod(notifications.frameNotification.FrameCount,10) == 0) {
phaseLoop(); phaseLoop();
} }
if (math.mod(notifications.frameNotification.FrameCount,10) == 5) { if (isint(notifications.frameNotification.FrameCount / 5)) {
ECAM_controller.loop(notification); ECAM_controller.loop(notification);
} }
return emesary.Transmitter.ReceiptStatus_OK; return emesary.Transmitter.ReceiptStatus_OK;

View file

@ -501,6 +501,7 @@ var warnings = std.Vector.new([
var altnLawProt = warning.new(msg: " (PROT LOST)", colour: "a"), var altnLawProt = warning.new(msg: " (PROT LOST)", colour: "a"),
var altnLawMaxSpeed = warning.new(msg: " MAX SPEED........320 KT", colour: "c"), var altnLawMaxSpeed = warning.new(msg: " MAX SPEED........320 KT", colour: "c"),
var altnLawMaxSpeed2 = warning.new(msg: " MAX SPEED........320/.77", colour: "c"), var altnLawMaxSpeed2 = warning.new(msg: " MAX SPEED........320/.77", colour: "c"),
var altnLawCare = warning.new(msg: " MANEUVER WITH CARE", colour: "c"),
var altnLawMaxSpdBrk = warning.new(msg: " SPD BRK.......DO NOT USE", colour: "c"), var altnLawMaxSpdBrk = warning.new(msg: " SPD BRK.......DO NOT USE", colour: "c"),
# Autothrust # Autothrust

View file

@ -117,7 +117,9 @@ var warningNodes = {
greenYellow: props.globals.initNode("/ECAM/warnings/hyd/green-yellow-failure"), greenYellow: props.globals.initNode("/ECAM/warnings/hyd/green-yellow-failure"),
greenYellowFuel: props.globals.initNode("/ECAM/warnings/hyd/green-yellow-fuel-consumpt"), greenYellowFuel: props.globals.initNode("/ECAM/warnings/hyd/green-yellow-fuel-consumpt"),
leftElevFail: props.globals.initNode("/ECAM/warnings/fctl/leftElevFault"), leftElevFail: props.globals.initNode("/ECAM/warnings/fctl/leftElevFault"),
leftElevNotAvail: props.globals.initNode("ECAM/warnings/fctl/leftElevFault-cond"),
rightElevFail: props.globals.initNode("/ECAM/warnings/fctl/rightElevFault"), rightElevFail: props.globals.initNode("/ECAM/warnings/fctl/rightElevFault"),
rightElevNotAvail: props.globals.initNode("ECAM/warnings/fctl/rightElevFault-cond"),
flapNotZero: props.globals.initNode("/ECAM/warnings/fctl/flaps-not-zero"), flapNotZero: props.globals.initNode("/ECAM/warnings/fctl/flaps-not-zero"),
slatsConfig: props.globals.initNode("/ECAM/warnings/fctl/slats-config-output"), slatsConfig: props.globals.initNode("/ECAM/warnings/fctl/slats-config-output"),
flapsConfig: props.globals.initNode("/ECAM/warnings/fctl/flaps-config-output"), flapsConfig: props.globals.initNode("/ECAM/warnings/fctl/flaps-config-output"),

View file

@ -20,8 +20,18 @@ var FCU = {
f.elecSupply = elecNode; f.elecSupply = elecNode;
return f; return f;
}, },
loop: func() { elec: nil,
me.failed = (me.elecSupply.getValue() < 25 or me.condition == 0) ? 1 : 0; powerOffTime: -99,
loop: func(notification) {
me.elec = me.elecSupply.getValue();
if (me.elec < 25) {
if (me.powerOffTime == -99) {
me.powerOffTime = notification.elapsedTime;
}
} else {
me.powerOffTime = -99;
}
me.failed = ((notification.elapsedTime > (me.powerOffTime + 0.25) and me.elec < 25) or me.condition == 0) ? 1 : 0;
}, },
setFail: func() { setFail: func() {
me.condition = 0; me.condition = 0;
@ -46,8 +56,8 @@ var FCUController = {
if (me._init == 0) { return; } if (me._init == 0) { return; }
# Update FCU Power # Update FCU Power
me.FCU1.loop(); me.FCU1.loop(notification);
me.FCU2.loop(); me.FCU2.loop(notification);
if (!me.FCU1.failed or !me.FCU2.failed) { if (!me.FCU1.failed or !me.FCU2.failed) {
me.FCUworking = 1; me.FCUworking = 1;

View file

@ -134,6 +134,11 @@ var duplicateNamesPage = {
} }
}, },
pushButtonLeft: func(indexSelect) { pushButtonLeft: func(indexSelect) {
if (indexSelect > size(me.vector)) {
mcdu_message(me.computer, "NOT ALLOWED");
return;
}
if (!dirToFlag) { if (!dirToFlag) {
if (!me.flagPBD and !me.flagPROG) { if (!me.flagPBD and !me.flagPROG) {
if (size(me.vector[0].id) == 5) { if (size(me.vector[0].id) == 5) {

View file

@ -368,6 +368,123 @@
</channel> </channel>
<channel name="ELAC Power Supply">
<switch name="/systems/fctl/power-supply/elac1/relay-condition">
<default value="0"/>
<test logic="OR" value="1">
/systems/hydraulic/blue-psi ge 1500
/systems/hydraulic/green-psi ge 1500
/systems/hydraulic/yellow-psi ge 1500
</test>
</switch>
<!-- if ELAC1 is not powered, then the timer does not run - this makes behaviour with cold + dark OK -->
<switch name="/systems/fctl/power-supply/elac1/relay-rate">
<default value="100"/>
<test logic="OR" value="0.03333333333">
/systems/fctl/elac1 eq 1
</test>
</switch>
<actuator name="/systems/fctl/power-supply/elac1/relay-timer">
<input>/systems/fctl/power-supply/elac1/relay-condition</input>
<rate_limit sense="incr">100</rate_limit>
<rate_limit sense="decr">0.03333333333</rate_limit> <!-- 30s -->
</actuator>
<switch name="/systems/fctl/power-supply/elac1/relay">
<default value="0"/>
<test logic="AND" value="/systems/electrical/bus/sub-bus/dc-hot-1-703">
/systems/electrical/bus/sub-bus/dc-hot-1-703 ge 25
/systems/fctl/power-supply/elac1/relay-timer ne 0
</test>
</switch>
<switch name="/systems/fctl/power-supply/elac2/relay-power">
<default value="0"/>
<test logic="AND" value="1"> <!-- latch as long as power is lost -->
/systems/fctl/power-supply/elac2/relay-power eq 1
/systems/electrical/bus/sub-bus/dc-2-202 lt 25
</test>
<test logic="AND" value="1"> <!-- only trigger if the ELAC is on -->
/systems/fctl/elac2 eq 1
/systems/electrical/bus/sub-bus/dc-2-202 lt 25
</test>
</switch>
<!-- Only if the relay has already gone on -
if blue is low or gear is not extended, it will go permanently rather than for just 30 seconds
in addition this will happen even if the timer has already reached 30 seconds
however, it will not trigger if the relay is not yet triggered
and it should not trigger unless the ELAC has already gained and then lost power -->
<switch name="/systems/fctl/power-supply/elac2/relay-power-override">
<default value="0"/>
<test logic="AND" value="1">
<test logic="OR">
/systems/hydraulic/blue-psi lt 1500
/gear/gear[1]/position-norm ne 0
</test>
/systems/electrical/some-electric-thingie/speed-abv-100 eq 1
/systems/fctl/power-supply/elac2/relay-power eq 1
</test>
</switch>
<actuator name="/systems/fctl/power-supply/elac2/relay-timer">
<input>/systems/fctl/power-supply/elac2/relay-power</input>
<rate_limit sense="incr">0.03333333333</rate_limit>
<rate_limit sense="decr">100</rate_limit>
</actuator>
<switch name="/systems/fctl/power-supply/elac2/relay">
<default value="0"/>
<test logic="AND" value="/systems/electrical/bus/sub-bus/dc-hot-2-704">
/systems/electrical/bus/sub-bus/dc-hot-2-704 ge 25
/systems/fctl/power-supply/elac2/relay-power eq 1
<test logic="OR">
/systems/fctl/power-supply/elac2/relay-power-override eq 1
/systems/fctl/power-supply/elac2/relay-timer ne 1
</test>
</test>
</switch>
</channel>
<channel name="SEC Power Supply">
<switch name="/systems/fctl/power-supply/sec1/relay-condition">
<default value="0"/>
<test logic="OR" value="1">
/systems/hydraulic/blue-psi ge 1500
/systems/hydraulic/green-psi ge 1500
/systems/hydraulic/yellow-psi ge 1500
</test>
</switch>
<!-- if SEC1 is not powered, then the timer does not run - this makes behaviour with cold + dark OK -->
<switch name="/systems/fctl/power-supply/sec1/relay-rate">
<default value="100"/>
<test logic="OR" value="0.03333333333">
/systems/fctl/sec1 eq 1
</test>
</switch>
<actuator name="/systems/fctl/power-supply/sec1/relay-timer">
<input>/systems/fctl/power-supply/sec1/relay-condition</input>
<rate_limit sense="incr">100</rate_limit>
<rate_limit sense="decr">0.03333333333</rate_limit> <!-- 30s -->
</actuator>
<switch name="/systems/fctl/power-supply/sec1/relay">
<default value="0"/>
<test logic="AND" value="/systems/electrical/bus/sub-bus/dc-hot-1-703">
/systems/electrical/bus/sub-bus/dc-hot-1-703 ge 25
/systems/fctl/power-supply/sec1/relay-timer ne 0
</test>
</switch>
</channel>
<channel name="Computers"> <channel name="Computers">
<switch name="/systems/fctl/lights/elac1-fault"> <switch name="/systems/fctl/lights/elac1-fault">
@ -377,19 +494,27 @@
/systems/fctl/elac1 eq 0 /systems/fctl/elac1 eq 0
</test> </test>
</switch> </switch>
<switch name="/systems/fctl/power-supply/elac1/has-power">
<default value="0"/>
<test logic="OR" value="1">
/systems/electrical/bus/dc-ess ge 25
/systems/fctl/power-supply/elac1/relay ge 25
</test>
</switch>
<actuator name="/systems/fctl/power-supply/elac1/has-power-output">
<input>/systems/fctl/power-supply/elac1/has-power</input>
<rate_limit sense="incr">100</rate_limit>
<rate_limit sense="decr">10</rate_limit> <!-- 100ms -->
</actuator>
<switch name="/systems/fctl/elac1"> <switch name="/systems/fctl/elac1">
<default value="0"/> <default value="0"/>
<test logic="AND" value="1"> <test logic="AND" value="1">
/controls/fctl/switches/elac1 eq 1 /controls/fctl/switches/elac1 eq 1
/systems/failures/fctl/elac1 eq 0 /systems/failures/fctl/elac1 eq 0
<test logic="OR"> /systems/fctl/power-supply/elac1/has-power-output ne 0
/systems/electrical/bus/dc-ess ge 25
<test logic="AND"> <!-- in flight: DC HOT backup -->
/systems/electrical/bus/sub-bus/dc-hot-1-703 ge 25
/gear/gear[1]/wow eq 0
</test>
</test>
</test> </test>
</switch> </switch>
@ -401,18 +526,26 @@
</test> </test>
</switch> </switch>
<switch name="/systems/fctl/power-supply/elac2/has-power">
<default value="0"/>
<test logic="OR" value="1">
/systems/electrical/bus/sub-bus/dc-2-202 ge 25
/systems/fctl/power-supply/elac2/relay ge 25
</test>
</switch>
<actuator name="/systems/fctl/power-supply/elac2/has-power-output">
<input>/systems/fctl/power-supply/elac2/has-power</input>
<rate_limit sense="incr">100</rate_limit>
<rate_limit sense="decr">10</rate_limit> <!-- 100ms -->
</actuator>
<switch name="/systems/fctl/elac2"> <switch name="/systems/fctl/elac2">
<default value="0"/> <default value="0"/>
<test logic="AND" value="1"> <test logic="AND" value="1">
/controls/fctl/switches/elac2 eq 1 /controls/fctl/switches/elac2 eq 1
/systems/failures/fctl/elac2 eq 0 /systems/failures/fctl/elac2 eq 0
<test logic="OR"> /systems/fctl/power-supply/elac2/has-power-output ne 0
/systems/electrical/bus/sub-bus/dc-2-202 ge 25
<test logic="AND"> <!-- in flight: DC HOT backup -->
/systems/electrical/bus/sub-bus/dc-hot-2-704 ge 25
/gear/gear[1]/wow eq 0
</test>
</test>
</test> </test>
</switch> </switch>
@ -424,18 +557,26 @@
</test> </test>
</switch> </switch>
<switch name="/systems/fctl/power-supply/sec1/has-power">
<default value="0"/>
<test logic="OR" value="1">
/systems/electrical/bus/dc-ess ge 25
/systems/fctl/power-supply/sec1/relay ge 25
</test>
</switch>
<actuator name="/systems/fctl/power-supply/sec1/has-power-output">
<input>/systems/fctl/power-supply/sec1/has-power</input>
<rate_limit sense="incr">100</rate_limit>
<rate_limit sense="decr">10</rate_limit> <!-- 100ms -->
</actuator>
<switch name="/systems/fctl/sec1"> <switch name="/systems/fctl/sec1">
<default value="0"/> <default value="0"/>
<test logic="AND" value="1"> <test logic="AND" value="1">
/controls/fctl/switches/sec1 eq 1 /controls/fctl/switches/sec1 eq 1
/systems/failures/fctl/sec1 eq 0 /systems/failures/fctl/sec1 eq 0
<test logic="OR"> /systems/fctl/power-supply/sec1/has-power-output ne 0
/systems/electrical/bus/dc-ess ge 25
<test logic="AND"> <!-- in flight: DC HOT backup -->
/systems/electrical/bus/sub-bus/dc-hot-1-703 ge 25
/gear/gear[1]/wow eq 0
</test>
</test>
</test> </test>
</switch> </switch>
@ -447,12 +588,25 @@
</test> </test>
</switch> </switch>
<switch name="/systems/fctl/power-supply/sec2/has-power">
<default value="0"/>
<test logic="OR" value="1">
/systems/electrical/bus/sub-bus/dc-2-204 ge 25
</test>
</switch>
<actuator name="/systems/fctl/power-supply/sec2/has-power-output">
<input>/systems/fctl/power-supply/sec2/has-power</input>
<rate_limit sense="incr">100</rate_limit>
<rate_limit sense="decr">10</rate_limit> <!-- 100ms -->
</actuator>
<switch name="/systems/fctl/sec2"> <switch name="/systems/fctl/sec2">
<default value="0"/> <default value="0"/>
<test logic="AND" value="1"> <test logic="AND" value="1">
/controls/fctl/switches/sec2 eq 1 /controls/fctl/switches/sec2 eq 1
/systems/failures/fctl/sec2 eq 0 /systems/failures/fctl/sec2 eq 0
/systems/electrical/bus/sub-bus/dc-2-204 ge 25 /systems/fctl/power-supply/sec2/has-power-output ne 0
</test> </test>
</switch> </switch>
@ -464,12 +618,26 @@
</test> </test>
</switch> </switch>
<switch name="/systems/fctl/power-supply/sec3/has-power">
<default value="0"/>
<test logic="OR" value="1">
/systems/electrical/bus/sub-bus/dc-2-204 ge 25
</test>
</switch>
<actuator name="/systems/fctl/power-supply/sec3/has-power-output">
<input>/systems/fctl/power-supply/sec3/has-power</input>
<rate_limit sense="incr">100</rate_limit>
<rate_limit sense="decr">10</rate_limit> <!-- 100ms -->
</actuator>
<switch name="/systems/fctl/sec3"> <switch name="/systems/fctl/sec3">
<default value="0"/> <default value="0"/>
<test logic="AND" value="1"> <test logic="AND" value="1">
/controls/fctl/switches/sec3 eq 1 /controls/fctl/switches/sec3 eq 1
/systems/failures/fctl/sec3 eq 0 /systems/failures/fctl/sec3 eq 0
/systems/electrical/bus/sub-bus/dc-2-204 ge 25 /systems/fctl/power-supply/sec3/has-power-output ne 0
</test> </test>
</switch> </switch>

View file

@ -305,7 +305,7 @@
/controls/hydraulic/switches/yellow-elec eq 1 /controls/hydraulic/switches/yellow-elec eq 1
/systems/failures/hydraulic/yellow-elec ne 1 /systems/failures/hydraulic/yellow-elec ne 1
<test logic="OR"> <!-- TODO: via 3XX CB 122VU --> <test logic="OR"> <!-- TODO: via 3XX CB 122VU -->
/systems/electrical/sources/ext/output-volt ge 110 /systems/electrical/relay/ext-epc/output ge 110
/systems/electrical/bus/ac-2 ge 110 /systems/electrical/bus/ac-2 ge 110
</test> </test>
</test> </test>

View file

@ -14,8 +14,8 @@
let blank_src; let blank_src;
let loading = 0; let loading = 0;
let scheduled_load = 0; let scheduled_load = 0;
function refresh_screen() { function refresh_screen(force) {
if (loading) { if (loading && !force) {
scheduled_load = 1; scheduled_load = 1;
} }
else { else {
@ -100,7 +100,19 @@
}); });
blank_src = screen_src; blank_src = screen_src;
screen_src = "/screenshot?canvasindex=10&type=png"; screen_src = "/screenshot?canvasindex=10&type=png";
setInterval(refresh_screen, 1000); screen.addEventListener('error', function () {
loading = 0;
if (scheduled_load) {
refresh_screen();
}
});
screen.addEventListener('abort', function () {
loading = 0;
if (scheduled_load) {
refresh_screen();
}
});
setInterval(function () { refresh_screen(true); }, 1000);
}, true); }, true);
</script> </script>
<style> <style>