103 lines
3.6 KiB
Text
103 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();
|
||
|
|