5df7a784e5
Replaces existing Nasal/failures.nas script with a programmable failure manager. The failure manager allows dynammic creation and removal of failure modes, on demand activation and a flexible set of triggers. The public interface can be found in Nasal/FailureMgr/public.nas Aircraft/Generic/Systems/failures.nas provides a library of triggers and failure actuators ready to use for programming the failure manager. A compatibility layer is included under Aircraft/Generic/Systems/compat_failure_modes.nas. This compatibility layer is currently loaded on startup and programs the FailureMgr to emulate the former behavior (same set of failure modes and compatible interface through the property tree). This first milestone is only intended to replace the failure management engine underneeth with minimum visible changes, and hopefully no aircraft breakages. Future milestones will build upon this to add a Canvas based procedural GUI and example integration on aircrafts.
427 lines
9.5 KiB
XML
427 lines
9.5 KiB
XML
<?xml version="1.0"?>
|
|
|
|
<PropertyList>
|
|
|
|
<name>system-failures</name>
|
|
<modal>false</modal>
|
|
<layout>vbox</layout>
|
|
|
|
<nasal>
|
|
<open>
|
|
# Code to populate the engine entries.
|
|
var groups = cmdarg().getChildren("group");
|
|
var group = groups[1].getChildren("group")[2];
|
|
var engines = props.globals.getNode("/engines");
|
|
var row = 4;
|
|
var engine = 0;
|
|
var i = 0;
|
|
|
|
group.removeChildren("checkbox");
|
|
group.removeChildren("input");
|
|
group.removeChildren("text");
|
|
|
|
# Copy in the labels.
|
|
var target = group.getNode("text[" ~ i ~ "]", 1);
|
|
props.copy(group.getNode("engine-label"), target);
|
|
i += 1;
|
|
|
|
target = group.getNode("text[" ~ i ~ "]", 1);
|
|
props.copy(group.getNode("mtbf-label"), target);
|
|
i += 1;
|
|
|
|
foreach (var e; engines.getChildren("engine")) {
|
|
var starter = e.getChild("starter");
|
|
var running = e.getChild("running");
|
|
|
|
(starter != nil and starter != "" and starter.getType() != "NONE")
|
|
or (running != nil and running != "" and running.getType() != "NONE")
|
|
or continue;
|
|
|
|
row = row + 1;
|
|
|
|
# Set up the label
|
|
target = group.getNode("text[" ~ i ~ "]", 1);
|
|
props.copy(group.getNode("text-template"), target);
|
|
target.getNode("row").setValue(row);
|
|
|
|
if (size(engines.getChildren("engine")) == 1) {
|
|
target.getNode("label").setValue("Engine");
|
|
} else {
|
|
# Engines are indexed from 1 in the GUI.
|
|
target.getNode("label").setValue("Engine " ~ (engine + 1));
|
|
}
|
|
|
|
# Now the checkbox
|
|
target = group.getNode("checkbox[" ~ i ~ "]", 1);
|
|
props.copy(group.getChild("checkbox-template"), target);
|
|
target.getNode("row").setValue(row);
|
|
|
|
var failure = "/sim/failure-manager/engines/engine[" ~ engine ~ "]/serviceable";
|
|
target.getNode("property").setValue(failure);
|
|
|
|
# Finally the MTBF
|
|
target = group.getNode("input[" ~ i ~ "]", 1);
|
|
props.copy(group.getChild("input-template"), target);
|
|
target.getNode("row").setValue(row);
|
|
i += 1;
|
|
|
|
var mtbf = "/sim/failure-manager/engines/engine[" ~ engine ~ "]/mtbf";
|
|
target.getNode("property").setValue(mtbf);
|
|
engine += 1;
|
|
}
|
|
|
|
|
|
</open>
|
|
</nasal>
|
|
|
|
<group>
|
|
<layout>hbox</layout>
|
|
<empty><stretch>1</stretch></empty>
|
|
|
|
<text>
|
|
<label>System Failures</label>
|
|
</text>
|
|
|
|
<empty><stretch>1</stretch></empty>
|
|
|
|
<button>
|
|
<pref-width>16</pref-width>
|
|
<pref-height>16</pref-height>
|
|
<legend></legend>
|
|
<keynum>27</keynum>
|
|
<border>2</border>
|
|
<binding>
|
|
<command>dialog-close</command>
|
|
</binding>
|
|
</button>
|
|
</group>
|
|
|
|
<hrule/>
|
|
|
|
<text>
|
|
<halign>left</halign>
|
|
<label>Uncheck a system to fail it, or set the Mean Time/Cycles Between Failures.</label>
|
|
</text>
|
|
|
|
<hrule/>
|
|
|
|
<group>
|
|
<layout>hbox</layout>
|
|
<halign>left</halign>
|
|
|
|
<group>
|
|
<layout>table</layout>
|
|
<halign>center</halign>
|
|
<valign>top</valign>
|
|
|
|
<text>
|
|
<row>0</row>
|
|
<col>0</col>
|
|
<label>System</label>
|
|
</text>
|
|
|
|
<text>
|
|
<row>0</row>
|
|
<col>2</col>
|
|
<label>MTBF (sec)</label>
|
|
</text>
|
|
|
|
<text>
|
|
<row>1</row>
|
|
<col>0</col>
|
|
<halign>right</halign>
|
|
<label>Vacuum System</label>
|
|
</text>
|
|
|
|
<checkbox>
|
|
<row>1</row>
|
|
<col>1</col>
|
|
<property>/sim/failure-manager/systems/vacuum/serviceable</property>
|
|
</checkbox>
|
|
|
|
<input>
|
|
<row>1</row>
|
|
<col>2</col>
|
|
<property>/sim/failure-manager/systems/vacuum/mtbf</property>
|
|
</input>
|
|
|
|
<text>
|
|
<row>2</row>
|
|
<col>0</col>
|
|
<halign>right</halign>
|
|
<label>Static System</label>
|
|
</text>
|
|
|
|
<checkbox>
|
|
<row>2</row>
|
|
<col>1</col>
|
|
<property>/sim/failure-manager/systems/static/serviceable</property>
|
|
</checkbox>
|
|
|
|
<input>
|
|
<row>2</row>
|
|
<col>2</col>
|
|
<property>/sim/failure-manager/systems/static/mtbf</property>
|
|
</input>
|
|
|
|
<text>
|
|
<row>3</row>
|
|
<col>0</col>
|
|
<halign>right</halign>
|
|
<label>Pitot System</label>
|
|
</text>
|
|
|
|
<checkbox>
|
|
<row>3</row>
|
|
<col>1</col>
|
|
<property>/sim/failure-manager/systems/pitot/serviceable</property>
|
|
</checkbox>
|
|
|
|
<input>
|
|
<row>3</row>
|
|
<col>2</col>
|
|
<property>/sim/failure-manager/systems/pitot/mtbf</property>
|
|
</input>
|
|
|
|
<text>
|
|
<row>4</row>
|
|
<col>0</col>
|
|
<halign>right</halign>
|
|
<label>Electrical System</label>
|
|
</text>
|
|
|
|
<checkbox>
|
|
<row>4</row>
|
|
<col>1</col>
|
|
<property>/sim/failure-manager/systems/electrical/serviceable</property>
|
|
</checkbox>
|
|
|
|
<input>
|
|
<row>4</row>
|
|
<col>2</col>
|
|
<property>/sim/failure-manager/systems/electrical/mtbf</property>
|
|
</input>
|
|
|
|
<text>
|
|
<row>5</row>
|
|
<col>0</col>
|
|
<halign>right</halign>
|
|
<label>Aileron</label>
|
|
</text>
|
|
|
|
<checkbox>
|
|
<row>5</row>
|
|
<col>1</col>
|
|
<property>/sim/failure-manager/controls/flight/aileron/serviceable</property>
|
|
</checkbox>
|
|
|
|
<input>
|
|
<row>5</row>
|
|
<col>2</col>
|
|
<property>/sim/failure-manager/controls/flight/aileron/mtbf</property>
|
|
</input>
|
|
|
|
<text>
|
|
<row>6</row>
|
|
<col>0</col>
|
|
<halign>right</halign>
|
|
<label>Elevator</label>
|
|
</text>
|
|
|
|
<checkbox>
|
|
<row>6</row>
|
|
<col>1</col>
|
|
<property>/sim/failure-manager/controls/flight/elevator/serviceable</property>
|
|
</checkbox>
|
|
|
|
<input>
|
|
<row>6</row>
|
|
<col>2</col>
|
|
<property>/sim/failure-manager/controls/flight/elevator/mtbf</property>
|
|
</input>
|
|
|
|
<text>
|
|
<row>7</row>
|
|
<col>0</col>
|
|
<halign>right</halign>
|
|
<label>Rudder</label>
|
|
</text>
|
|
|
|
<checkbox>
|
|
<row>7</row>
|
|
<col>1</col>
|
|
<property>/sim/failure-manager/controls/flight/rudder/serviceable</property>
|
|
</checkbox>
|
|
|
|
<input>
|
|
<row>7</row>
|
|
<col>2</col>
|
|
<property>/sim/failure-manager/controls/flight/rudder/mtbf</property>
|
|
</input>
|
|
|
|
|
|
</group>
|
|
|
|
<vrule/>
|
|
|
|
<group>
|
|
<layout>table</layout>
|
|
<halign>center</halign>
|
|
<valign>top</valign>
|
|
|
|
<text>
|
|
<row>0</row>
|
|
<col>0</col>
|
|
<label>System</label>
|
|
</text>
|
|
|
|
<text>
|
|
<row>0</row>
|
|
<col>2</col>
|
|
<label>MCBF</label>
|
|
</text>
|
|
|
|
<text>
|
|
<row>1</row>
|
|
<col>0</col>
|
|
<halign>right</halign>
|
|
<label>Landing Gear</label>
|
|
</text>
|
|
|
|
<checkbox>
|
|
<row>1</row>
|
|
<col>1</col>
|
|
<property>/sim/failure-manager/controls/gear/serviceable</property>
|
|
</checkbox>
|
|
|
|
<input>
|
|
<row>1</row>
|
|
<col>2</col>
|
|
<property>/sim/failure-manager/controls/gear/mcbf</property>
|
|
</input>
|
|
|
|
<text>
|
|
<row>2</row>
|
|
<col>0</col>
|
|
<halign>right</halign>
|
|
<label>Flaps</label>
|
|
</text>
|
|
|
|
<checkbox>
|
|
<row>2</row>
|
|
<col>1</col>
|
|
<property>/sim/failure-manager/controls/flight/flaps/serviceable</property>
|
|
</checkbox>
|
|
|
|
<input>
|
|
<row>2</row>
|
|
<col>2</col>
|
|
<property>/sim/failure-manager/controls/flight/flaps/mcbf</property>
|
|
</input>
|
|
|
|
<text>
|
|
<row>3</row>
|
|
<col>0</col>
|
|
<halign>right</halign>
|
|
<label>Speedbrake</label>
|
|
</text>
|
|
|
|
<checkbox>
|
|
<row>3</row>
|
|
<col>1</col>
|
|
<property>/sim/failure-manager/controls/flight/speedbrake/serviceable</property>
|
|
</checkbox>
|
|
|
|
<input>
|
|
<row>3</row>
|
|
<col>2</col>
|
|
<property>/sim/failure-manager/controls/flight/speedbrake/mcbf</property>
|
|
</input>
|
|
</group>
|
|
|
|
<vrule/>
|
|
|
|
<group>
|
|
<layout>table</layout>
|
|
<halign>center</halign>
|
|
<valign>top</valign>
|
|
|
|
<engine-label>
|
|
<row>0</row>
|
|
<col>0</col>
|
|
<label>Engine</label>
|
|
</engine-label>
|
|
|
|
<mtbf-label>
|
|
<row>0</row>
|
|
<col>2</col>
|
|
<label>MTBF</label>
|
|
</mtbf-label>
|
|
|
|
<text-template>
|
|
<row><!-- template value--></row>
|
|
<col>0</col>
|
|
<halign>right</halign>
|
|
<label><!-- template value--></label>
|
|
</text-template>
|
|
|
|
<checkbox-template>
|
|
<row><!-- template value--></row>
|
|
<col>1</col>
|
|
<property><!-- template value--></property>
|
|
</checkbox-template>
|
|
|
|
<input-template>
|
|
<row><!-- template value--></row>
|
|
<col>2</col>
|
|
<property><!-- template value--></property>
|
|
</input-template>
|
|
|
|
</group>
|
|
</group>
|
|
|
|
<hrule/>
|
|
|
|
<group>
|
|
<layout>hbox</layout>
|
|
|
|
<button>
|
|
<legend>OK</legend>
|
|
<default>true</default>
|
|
<equal>true</equal>
|
|
<binding>
|
|
<command>dialog-apply</command>
|
|
</binding>
|
|
<binding>
|
|
<command>dialog-close</command>
|
|
</binding>
|
|
</button>
|
|
|
|
<button>
|
|
<legend>Apply</legend>
|
|
<equal>true</equal>
|
|
<binding>
|
|
<command>dialog-apply</command>
|
|
</binding>
|
|
</button>
|
|
|
|
<button>
|
|
<legend>Refresh</legend>
|
|
<equal>true</equal>
|
|
<binding>
|
|
<command>dialog-update</command>
|
|
</binding>
|
|
</button>
|
|
|
|
<button>
|
|
<legend>Cancel</legend>
|
|
<equal>true</equal>
|
|
<key>Esc</key>
|
|
<binding>
|
|
<command>dialog-close</command>
|
|
</binding>
|
|
</button>
|
|
|
|
</group>
|
|
|
|
</PropertyList>
|