ercoupe: fix "nil used in numeric context" errors
[fg:toms-fgdata.git] / Aircraft / ercoupe / Nasal / ercoupe.nas
1 # Ercoupe nasal program
2 # relased under the GPL
3
4 # Called from ercoupe-set.xml.
5 # Ercoupes have mechanically coordinated ailerons and rudder. No rudder pedals.
6
7 #####################################
8
9 var cockpit_mute=nil;
10 var fuel_system=nil;
11
12 var my_last_time = 0.0;
13
14 props.globals.getNode("/sim/time/fast_timer",1).setDoubleValue(0.0);
15
16
17 var fast_timer= func {
18         var time = props.globals.getNode("/sim/time/fast_timer",1).getValue() + props.globals.getNode("sim/time/delta-sec",1).getValue();
19         props.globals.getNode("/sim/time/fast_timer",1).setDoubleValue(time);
20         settimer( fast_timer, 0);
21 }
22
23 setlistener("/sim/signals/electrical-initialized", func {
24         FDM = 1;
25         cockpit_mute = Volume.new(0);
26         fuel_system = Fuel.new(0);
27
28         fast_timer();
29         settimer(update_ercoupe,1);
30 #       gui.menuEnable("fuel-and-payload", "/sim/flight-model" == "jsb");
31         print("Ercoupe Started ... OK");
32 });
33
34 # Cockpit sound volume
35 var Volume = {
36         new : func (n) {
37                 var m = { parents : [Volume] };
38
39                 m.volumeN = props.globals.getNode("sim/sound/cockpit-volume", 1);
40                 m.muteN = props.globals.getNode("sim/sound/cockpit-mute", 1);
41                 m.viewN = props.globals.getNode("sim/current-view/internal", 1);
42                 m.windowN = props.globals.getNode("surface-positions/speedbrake-pos-norm", 1);
43                 m.self = n;
44                 return m;
45         },
46         update : func {
47                 var volume=0;
48                 if (me.viewN.getBoolValue()) {
49                         volume=1 - me.windowN.getValue();
50                 }
51                 me.volumeN.setDoubleValue(1 - volume);
52                 me.muteN.setDoubleValue(volume);
53         },
54 };
55
56 # Fuel Transfer
57 var Fuel = {
58         new : func (n) {
59                 var m = { parents : [Fuel] };
60                 
61                 m.headerN = props.globals.initNode("consumables/fuel/tank[0]/level-gal_us", 0, "DOUBLE");
62                 m.headerCap = props.globals.initNode("consumables/fuel/tank[0]/capacity-gal_us", 0 "DOUBLE").getValue();
63                 m.winglN =  props.globals.initNode("consumables/fuel/tank[1]/level-gal_us", 0, "DOUBLE");
64                 m.wingrN =  props.globals.initNode("consumables/fuel/tank[2]/level-gal_us", 0, "DOUBLE");
65                 m.fuelpumpN = props.globals.initNode("systems/electrical/outputs/fuel-pump", 0, "DOUBLE");
66 #               needs switch for header - > engine
67
68                 return m;
69         },
70         update : func (dt) {
71                 var level = me.headerN.getValue();
72                 var delta = me.headerCap - level;
73                 var available = me.winglN.getValue();
74                 var transfer = 0;
75                 var max_transfer = 0.12*dt; # in gallons per second, roughly 7 gpm
76                 if(me.fuelpumpN.getValue() > 11.0){# if power to fuel pump
77                         if (available > (delta)) {
78                                 transfer = delta;
79                         } else {
80                                 transfer = available;
81                         }
82                         if (transfer > max_transfer) {
83                                 transfer=max_transfer;
84                         }
85                         me.headerN.setDoubleValue(level + transfer);
86                         me.winglN.setDoubleValue(available - transfer);
87                 }
88                 var left  = me.winglN.getValue();
89                 var right = me.wingrN.getValue();
90                 delta = (right - left)/2;
91                 left += delta;
92                 right -= delta;
93                 me.winglN.setDoubleValue(left);
94                 me.wingrN.setDoubleValue(right);
95         },
96 };
97
98 var update_ercoupe = func {
99         var time = getprop("/sim/time/fast_timer");
100         var dt = time - my_last_time;
101 #print ("dT = "~dt~" ,time = "~time~" ,last = "~my_last_time);
102         my_last_time = time;
103
104         cockpit_mute.update();
105         fuel_system.update(dt);
106         
107         settimer(update_ercoupe,1);
108 }
109