1
0
Fork 0
fgdata/Aircraft/Instruments-3d/glider/vario/ilec-sc7/ilec-sc7.nas

102 lines
3.6 KiB
Text

var debug_enabled = 0;
## helpers
#
var FT2M=0.30480;
var KT2MPS=1852/3600;
var square=func(x) return x*x;
var get_delta=func (current,previous) {return (current-previous);}
var state = {new:func {return{parents:[state]};},altitude_m:0,airspeed_mps:0,timestamp:0,te_read:0};
var samples = []; setsize(samples, 30);
var te_needle =0;
setprop("/instrumentation/ilec-sc7/te-reading-mps",0);
setprop("/instrumentation/ilec-sc7/volume",0.8);
setprop("/instrumentation/ilec-sc7/audio",2);
setprop("/instrumentation/ilec-sc7/mode",1);
setprop("/instrumentation/ilec-sc7/sensitivity",1);
setprop("/instrumentation/ilec-sc7/filter",0.05);
var update_state = func {
var s = state.new();
s.altitude_m=getprop("/position/altitude-ft")*FT2M;
s.airspeed_mps=getprop("/velocities/airspeed-kt")*KT2MPS;
s.timestamp=systime();
return s;
}
var push30 = func {
var i = 0;
while ( i < 30 ) {
samples[i]=0;
i += 1;
};
}
##
# debug info
var s_dump = func(s) {
print(s.timestamp," ", s.altitude_m, " ", s.airspeed_mps);
}
var averager = func {
var sum = 0 ;
var i = 0;
while ( i < 29 ) {
samples[i] = samples[i+1]; # shift everything to the "left"
i += 1;
};
samples[29] = te_needle; # and set last sample to current
i = 0;
while ( i < 30 ) {
sum = sum + samples[i];
i += 1;
};
var average30 = sum / 30;
setprop("/instrumentation/ilec-sc7/average",math.abs(average30));
setprop("/instrumentation/ilec-sc7/average-sign",math.sgn(average30));
if (debug_enabled) print (" average ",average30);
settimer(averager, 1); # update rate
}
var tvario = {
new: func {return {parents:[tvario]};},
state:{previous:,current:},
init: func {state.previous=state.new(); state.current=state.new();},
update:func {
if (debug_enabled) print("\nUpdating TEV:");
state.current = update_state();
if (debug_enabled) {
s_dump(state.current);
s_dump(state.previous);
}
var delta_t = get_delta(state.current.timestamp, state.previous.timestamp);
# TE reading = (h2-h1)/t + (v2^2 - v1^2) / 19.62*t
if (debug_enabled) print("delta_t:",delta_t);
var uncompensated = get_delta(state.current.altitude_m,state.previous.altitude_m) / delta_t;
if (debug_enabled) print(" uncompensated:",uncompensated);
var adjustment = get_delta(square(state.current.airspeed_mps),square(state.previous.airspeed_mps)) / (19.62 * delta_t);
if (debug_enabled) print(" adjustment:",adjustment,"\n");
var te_reading = uncompensated + adjustment;
if (debug_enabled) print (" te_reading:",te_reading);
te_needle = getprop("/instrumentation/ilec-sc7/te-reading-mps");
var filter = 0.01 + 0.02 * getprop("/instrumentation/ilec-sc7/sensitivity");
setprop("/instrumentation/ilec-sc7/filter",filter);
te_needle = te_needle * (1-filter) + filter * te_reading;
setprop("/instrumentation/ilec-sc7/te-reading-mps",te_needle);
setprop("/instrumentation/ilec-sc7/te-reading-neg",-te_needle);
state.previous = state.current; # save current state for next call
settimer(func me.update(), 1/20); # update rate
}
};
var tv = tvario.new();
tv.init();
tv.update();
push30();
averager();