1 # Properties under /consumables/fuel/tank[n]:
2 # + level-gal_us - Current fuel load. Can be set by user code.
3 # + level-lbs - OUTPUT ONLY property, do not try to set
4 # + selected - boolean indicating tank selection.
5 # + density-ppg - Fuel density, in lbs/gallon.
6 # + capacity-gal_us - Tank capacity
8 # Properties under /engines/engine[n]:
9 # + fuel-consumed-lbs - Output from the FDM, zeroed by this script
10 # + out-of-fuel - boolean, set by this code.
13 var UPDATE_PERIOD = 0.3;
21 var consumed_fuel = 0;
22 foreach (var e; engines) {
23 var fuel = e.getNode("fuel-consumed-lbs");
24 consumed_fuel += fuel.getValue();
25 fuel.setDoubleValue(0);
32 var selected_tanks = [];
33 foreach (var t; tanks) {
34 var cap = t.getNode("capacity-gal_us").getValue();
35 if (cap > 0.01 and t.getNode("selected").getBoolValue()) {
36 append(selected_tanks, t);
40 # Subtract fuel from tanks, set auxilliary properties. Set out-of-fuel
41 # when any one tank is dry.
43 if (size(selected_tanks) == 0) {
46 var fuel_per_tank = consumed_fuel / size(selected_tanks);
47 foreach (var t; selected_tanks) {
48 var ppg = t.getNode("density-ppg").getValue();
49 var lbs = t.getNode("level-gal_us").getValue() * ppg;
50 lbs = lbs - fuel_per_tank;
53 # Kill the engines if we're told to, otherwise simply
55 if (t.getNode("kill-when-empty", 1).getBoolValue()) {
58 t.getNode("selected").setBoolValue(0);
62 t.getNode("level-gal_us").setDoubleValue(gals);
63 t.getNode("level-lbs").setDoubleValue(lbs);
67 # Total fuel properties
72 foreach (var t; tanks) {
73 lbs += t.getNode("level-lbs").getValue();
74 gals += t.getNode("level-gal_us").getValue();
75 cap += t.getNode("capacity-gal_us").getValue();
78 total_lbs.setDoubleValue(lbs);
79 total_gals.setDoubleValue(gals);
80 total_norm.setDoubleValue(gals / cap);
82 foreach (var e; engines) {
83 e.getNode("out-of-fuel").setBoolValue(out_of_fuel);
90 settimer(loop, UPDATE_PERIOD);
94 init_double_prop = func(node, prop, val) {
95 if (node.getNode(prop) != nil) {
96 val = num(node.getNode(prop).getValue());
98 node.getNode(prop, 1).setDoubleValue(val);
105 var fuel_freeze = nil;
106 var total_gals = nil;
108 var total_norm = nil;
111 var L = _setlistener("/sim/signals/fdm-initialized", func {
114 setlistener("/sim/freeze/fuel", func { fuel_freeze = cmdarg().getBoolValue() }, 1);
116 total_gals = props.globals.getNode("/consumables/fuel/total-fuel-gals", 1);
117 total_lbs = props.globals.getNode("/consumables/fuel/total-fuel-lbs", 1);
118 total_norm = props.globals.getNode("/consumables/fuel/total-fuel-norm", 1);
120 engines = props.globals.getNode("engines", 1).getChildren("engine");
121 foreach (var e; engines) {
122 e.getNode("fuel-consumed-lbs", 1).setDoubleValue(0);
123 e.getNode("out-of-fuel", 1).setBoolValue(0);
126 foreach (var t; props.globals.getNode("/consumables/fuel", 1).getChildren("tank")) {
127 if (!size(t.getChildren())) {
128 continue; # skip native_fdm.cxx generated zombie tanks
131 init_double_prop(t, "level-gal_us", 0.0);
132 init_double_prop(t, "level-lbs", 0.0);
133 init_double_prop(t, "capacity-gal_us", 0.01); # not zero (div/zero issue)
134 init_double_prop(t, "density-ppg", 6.0); # gasoline
136 if (t.getNode("selected") == nil) {
137 t.getNode("selected", 1).setBoolValue(1);