Hi,

Bring back from Attic where it was trowed by error.
Fix to follow new AITanker.

Same file for both PLIB and OSG.

Thanks for commiting
# Properties under /consumables/fuel/tank[n]:
# + level-gal_us    - Current fuel load.  Can be set by user code.
# + level-lbs       - OUTPUT ONLY property, do not try to set
# + selected        - boolean indicating tank selection.
# + density-ppg     - Fuel density, in lbs/gallon.
# + capacity-gal_us - Tank capacity
#
# Properties under /engines/engine[n]:
# + fuel-consumed-lbs - Output from the FDM, zeroed by this script
# + out-of-fuel       - boolean, set by this code.


var UPDATE_PERIOD = 0.1;

var enabled = nil;
var fuel_freeze = nil;
var ai_enabled = nil;
var engines = nil;
var tanks = nil;
var refuelingN = nil;
var aimodelsN = nil;
var out_of_fuel = nil;
var aar_rcvr = nil;
var aar_lock = nil;
var aar_state = nil;

# initialize property if it doesn't exist, and set node type otherwise
init_prop = func(node, prop, val, type = "double") {
        var n = node.getNode(prop);
        if (n != nil) {
                var v = n.getValue();
                if (v != nil) {
                        val = v;
                }
        }
        node = node.getNode(prop, 1);
        if (type == "double") {
                node.setDoubleValue(val);
        } elsif (type == "bool") {
                node.setBoolValue(val);
        } elsif (type == "int") {
                node.setIntValue(val);
        }
}



update_loop = func {
        # check for contact with tanker aircraft
        var tankers = [];
        if (ai_enabled) {
                foreach (a; aimodelsN.getChildren("tanker")) {
                        var contact = a.getNode("refuel/contact", 
1).getBoolValue();
                        var tanker = a.getNode("tanker", 1).getBoolValue();
                        var id = a.getNode("id").getValue();
                        #print("ai '", id, "'  contact=", contact, "  tanker=", 
tanker);

                        if (tanker and contact) {
                                append(tankers, a);
                        }
                }

                foreach (m; aimodelsN.getChildren("multiplayer")) {
                        var contact = 
m.getNode("refuel/contact").getBoolValue();
                        var tanker = m.getNode("tanker").getBoolValue();
                        var id = m.getNode("id").getValue();
                        print("mp '", id, "'  contact=", contact, "  tanker=", 
tanker);

                        if (tanker and contact) {
                                append(tankers, m);
                        }
                }
        }
        # A-10 specific receiver logic
        var refueling = size(tankers) >= 1;
        refuelingN.setBoolValue(refueling);
        if (size(tankers) >= 1) {
                if ((! aar_lock) and (aar_rcvr)) {
                        refueling = 1;
                        aar_state = 1;
                } else {
                        refueling = 0;
                }
        } elsif (aar_state) {
                aar_lock = 1;
                setprop("sim/model/A-10/controls/fuel/aar-lock", aar_lock);
                aar_state = 0;
        }

        if (fuel_freeze) {
                return settimer(update_loop, UPDATE_PERIOD);
        }


        # sum up consumed fuel
        var total = 0;
        foreach (var e; engines) {
                total += e.getNode("fuel-consumed-lbs").getValue();
                e.getNode("fuel-consumed-lbs", 1).setDoubleValue(0);
        }       

        # unlock A-10 aar receiver lock and calculate fuel received
        if (refueling) {
                # assume max flow rate is 6000 lbs/min (for KC135)
                var received = 100 * UPDATE_PERIOD;
                total -= received;
        }


        # make list of selected tanks
        var selected_tanks = [];
        foreach (var t; tanks) {
                var cap = t.getNode("capacity-gal_us", 1).getValue();
                if (cap != nil and cap > 0.01 and t.getNode("selected", 
1).getBoolValue()) {
                        append(selected_tanks, t);
                }
        }



        if (size(selected_tanks) == 0) {
                out_of_fuel = 1;
                
        } else {
                out_of_fuel = 0;
                if (total >= 0) {
                        var fuelPerTank = total / size(selected_tanks);
                        foreach (var t; selected_tanks) {
                                var ppg = t.getNode("density-ppg").getValue();
                                var lbs = t.getNode("level-gal_us").getValue() 
* ppg;
                                lbs -= fuelPerTank;

                                if (lbs < 0) {
                                        lbs = 0;
                                        # Kill the engines if we're told to, 
otherwise simply
                                        # deselect the tank.
                                        if (t.getNode("kill-when-empty", 
1).getBoolValue()) {
                                                out_of_fuel = 1;
                                        } else {
                                                t.getNode("selected", 
1).setBoolValue(0);
                                        }
                                }

                                var gals = lbs / ppg;
                                t.getNode("level-gal_us").setDoubleValue(gals);
                                t.getNode("level-lbs").setDoubleValue(lbs);
                        }

                } elsif (total < 0) {
                        #find the number of tanks which can accept fuel
                        var available = 0;

                        foreach (var t; selected_tanks) {
                                var ppg = t.getNode("density-ppg").getValue();
                                var capacity = 
t.getNode("capacity-gal_us").getValue() * ppg;
                                var lbs = t.getNode("level-gal_us").getValue() 
* ppg;

                                if (lbs < capacity) {
                                        available += 1;
                                }
                        }

                        if (available > 0) {
                                var fuelPerTank = total / available;

                                # add fuel to each available tank
                                foreach (var t; selected_tanks) {
                                        var ppg = 
t.getNode("density-ppg").getValue();
                                        var capacity = 
t.getNode("capacity-gal_us").getValue() * ppg;
                                        var lbs = 
t.getNode("level-gal_us").getValue() * ppg;

                                        if (capacity - lbs >= fuelPerTank) {
                                                lbs -= fuelPerTank;
                                        } elsif (capacity - lbs < fuelPerTank) {
                                                lbs = capacity;
                                        }

                                        
t.getNode("level-gal_us").setDoubleValue(lbs / ppg);
                                        
t.getNode("level-lbs").setDoubleValue(lbs);
                                }

                                # print ("available ", available , " 
fuelPerTank " , fuelPerTank);
                        }
                }
        }


        var gals = 0;
        var lbs = 0;
        var cap = 0;
        foreach (var t; tanks) {
                gals += t.getNode("level-gal_us", 1).getValue();
                lbs += t.getNode("level-lbs", 1).getValue();
                cap += t.getNode("capacity-gal_us", 1).getValue();
        }

        setprop("/consumables/fuel/total-fuel-gals", gals);
        setprop("/consumables/fuel/total-fuel-lbs", lbs);
        setprop("/consumables/fuel/total-fuel-norm", gals / cap);
        
        # prepare values for the A-10's fuel gauge and warning lights 
        left_wing = getprop("consumables/fuel/tank[0]/level-lbs");
        left_main = getprop("consumables/fuel/tank[1]/level-lbs");
        right_main = getprop("consumables/fuel/tank[2]/level-lbs");
        right_wing = getprop("consumables/fuel/tank[3]/level-lbs");
        total_int_left = left_wing + left_main;
        total_int_right = right_wing + right_main;
        setprop("sim/model/A-10/consumables/fuel/int-left-lbs", total_int_left);
        setprop("sim/model/A-10/consumables/fuel/int-right-lbs", 
total_int_right);
        diff_lbs = abs(right_main - left_main);
        setprop("sim/model/A-10/consumables/fuel/diff-lbs", diff_lbs);
        
        # stop the A-10's engines when off or when out of fuel  
        var start_state = 
getprop("sim/model/A-10/engines/engine[0]/start-state");
        var n1 = getprop("engines/engine[0]/n1");
        var running = getprop("sim/model/A-10/engines/engine[0]/running");

        if (! running) {
                setprop("engines/engine[0]/out-of-fuel", 1);
        } else {
                setprop("engines/engine[0]/out-of-fuel", out_of_fuel);
                if (start_state >= 1) {
                        setprop("sim/model/A-10/engines/engine[0]/n1", n1);
                }
        }
        start_state = getprop("sim/model/A-10/engines/engine[1]/start-state");
        n1 = getprop("engines/engine[1]/n1");
        running = getprop("sim/model/A-10/engines/engine[1]/running");

        if (! running) {
                setprop("engines/engine[1]/out-of-fuel", 1);
        } else {
                setprop("engines/engine[1]/out-of-fuel", out_of_fuel);
                if (start_state >= 1) {
                        setprop("sim/model/A-10/engines/engine[1]/n1", n1);
                }
        }
        

        # miscelaneous A-10's props
        setprop("velocities/ground-speed-kt", ground_speed());


        settimer(update_loop, UPDATE_PERIOD);
}



initialize = func {
        fuel.update = func {}   # kill $FG_ROOT/Nasal/fuel.nas' loop
        print ("Initializing Nasal Fuel System");
        refuelingN = props.globals.getNode("/systems/refuel/contact", 1);
        refuelingN.setBoolValue(0);
        aar_rcvr = getprop("sim/model/A-10/controls/fuel/receiver-lever");
        aar_lock = getprop("sim/model/A-10/controls/fuel/aar-lock");
        aar_state = 0;
        aimodelsN = props.globals.getNode("ai/models", 1);
        engines = props.globals.getNode("engines", 1).getChildren("engine");
        tanks = props.globals.getNode("consumables/fuel", 
1).getChildren("tank");

        foreach (var e; engines) {
                e.getNode("fuel-consumed-lbs", 1).setDoubleValue(0);
                e.getNode("out-of-fuel", 1).setBoolValue(0);
        }

        foreach (var t; tanks) {
                init_prop(t, "level-gal_us", 0);
                init_prop(t, "level-lbs", 0);
                init_prop(t, "capacity-gal_us", 0.01); # Not zero (div/zero 
issue)
                init_prop(t, "density-ppg", 6.0);      # gasoline
                init_prop(t, "selected", 1, "bool");
        }

        setlistener("sim/freeze/fuel", func { fuel_freeze = 
cmdarg().getBoolValue() }, 1);
        setlistener("sim/ai/enabled", func { ai_enabled = 
cmdarg().getBoolValue() }, 1);

        update_loop();
}

ground_speed = func {
        nfps = getprop("velocities/speed-north-fps");
        efps = getprop("velocities/speed-east-fps");
        vfps =  math.sqrt((nfps * nfps) + (efps * efps));
        # 1 kph = 1 fps / 6080.27 * 3600 
        vkph = vfps * 0.59207897;
        return(vkph);
}

aar_receiver_lever = func {
        input = arg[0];
        aar_rcvr = getprop("sim/model/A-10/controls/fuel/receiver-lever");
        if (input == 1) {
                aar_rcvr = 1;
                setprop("sim/model/A-10/controls/fuel/receiver-lever", 
aar_rcvr);
        } elsif (input == -1) {
                aar_rcvr = 0;
                setprop("sim/model/A-10/controls/fuel/receiver-lever", 
aar_rcvr);
                aar_lock = 0;
                setprop("sim/model/A-10/controls/fuel/aar-lock", aar_lock);
        }
}


setlistener("/sim/signals/fdm-initialized", initialize);

-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Flightgear-devel mailing list
Flightgear-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/flightgear-devel

Reply via email to