1 contributor
var displayClass = {
new: func(node, role) {
var m = { parents: [ displayClass ] };
m.display = canvas.new({
"name" : role,
"size" : [1024, 768],
"view" : [1024, 768],
"mipmapping": 1
});
m.display.addPlacement({
"node": "Screen",
"parent": role
});
m.display.setColorBackground(0,0,0);
m.role = role;
m.screenElements = {};
return m;
},
loadsvg : func () {
me.screen = me.display.createGroup();
me.screen.hide();
canvas.parsesvg(me.screen, "Aircraft/Instruments-3d/zkv1000/Systems/screen.svg");
},
_showInitProgress : func (p,t) {
p.setText(t);
if (zkv.getNode(me.role ~ 'init').getValue() != 0) {
if (size(t) >= 10) t = '';
settimer(func { me._showInitProgress(p, t ~ '.'); }, 0.1);
}
else {
me.progress.hide();
me.screen.show();
me.loadGroup({
show : [
'SoftKeysTexts',
'COMM',
'NAV',
'XPDR-TIME',
'FlightInstruments',
'Horizon',
'bankPointer',
'VSI',
],
text: [
'VSIText',
'Speed110'
],
clip: [
'SpeedLint1',
'SpeedTape'
],
});
me.updateAI(getprop('/orientation/roll-deg'),getprop('orientation/pitch-deg'));
me.updateVSI(getprop('/instrumentation/vertical-speed-indicator/indicated-speed-fpm'));
me.updateIAS(getprop('/velocities/airspeed-kt'));
me.progress.removeAllChildren();
me.progress = nil;
me.showInitProgress = nil;
me._showInitProgress = nil;
zkv.removeChild(me.role ~ 'init');
}
},
showInitProgress : func (role) {
me.progress = me.display.createGroup();
me.progress.show();
me.progress.createChild("text", role ~ " title")
.setTranslation(512, 384)
.setAlignment("center-center")
.setFont("LiberationFonts/LiberationSans-Italic.ttf")
.setFontSize(64, 1)
.setColor(1,1,1)
.setText("ZKV1000 " ~ role ~ " init");
zkv.getNode(role ~ 'init',1).setIntValue(1);
me._showInitProgress(me.progress.createChild("text", role ~ "progress")
.setTranslation(512, 484)
.setAlignment("center-center")
.setFont("LiberationFonts/LiberationSans-Bold.ttf")
.setFontSize(128, 1)
.setColor(1,0,0), '.');
},
loadGroup : func (h) {
if (typeof(h) != 'hash') {
msg_dbg(sprintf("%s need a hash, but get a %s from %s",
caller(0)[0],
typeof(h),
caller(1)[0]));
return;
}
var setMethod = func (e, t) {
if (t == 'hide')
me.screenElements[e].hide();
elsif (t == 'show')
me.screenElements[e].show();
elsif (t == 'rot' or t == 'trans') {
if (! contains(me.screenElements[e], t))
me.screenElements[e][t] = me.screenElements[e].createTransform();
}
elsif (t == 'clip') {
if (contains(me.clips, e))
me.screenElements[e].set("clip", me.clips[e]);
else
print('no defined clip for ' ~ e);
}
elsif (t == 'text') {
if (contains(me.texts, e)) {
if (contains(me.texts[e], 'alignment'))
me.screenElements[e].setAlignment(me.texts[e].alignment);
if (contains(me.texts[e], 'default'))
me.screenElements[e].setText(me.texts[e].default);
}
else
print('no alignment for ' ~ e);
}
else
print('unknown method ' ~ t);
};
foreach (var todo; keys(h)) {
if (typeof(h[todo]) != 'vector') h[todo] = [ h[todo] ];
foreach (var id; h[todo]) {
if (! contains(me.screenElements, id)) {
me.screenElements[id] = me.screen.getElementById(id);
if (me.screenElements[id] != nil)
setMethod(id, todo);
else
print('SVG ID ' ~ id ~ ' not found');
}
else
setMethod(id, todo);
}
}
},
clips : {
PitchScale : "rect(70,664,370,256)",
SpeedLint1 : "rect(252,226,318,204)",
SpeedTape : "rect(115,239,455,156)",
},
texts : {
VSIText : {
alignment: "right-bottom", default : num('0'),
},
Speed110 : {
default: '', alignment : 'left-bottom'
},
},
updateAI: func(roll,pitch){
if (pitch > 80)
pitch = 80;
elsif(pitch < -80)
pitch = -80;
me.screenElements.Horizon
.setRotation(-roll * D2R)
.setTranslation(0, pitch * 6.8571428);
me.screenElements.bankPointer
.setRotation(-roll * D2R);
settimer(func me.updateAI(getprop('/orientation/roll-deg'),getprop('orientation/pitch-deg')), 0.1);
},
updateVSI: func (vsi) {
me.screenElements.VSIText
.setText(num(math.round(vsi, 10)));
if (vsi > 4500)
vsi = 4500;
elsif (vsi < -4500)
vsi = -4500;
me.screenElements.VSI
.setTranslation(0, vsi * -0.03465);
settimer(func me.updateVSI(getprop('/instrumentation/vertical-speed-indicator/indicated-speed-fpm')), 0.1);
},
updateIAS: func (ias) {
if (ias >= 10)
me.screenElements.Speed110
.setText(sprintf("% 2u",num(math.floor(ias/10))));
else
me.screenElements.Speed110
.setText('');
me.screenElements.SpeedLint1
.setTranslation(0,(math.mod(ias,10) + (ias >= 10)*10) * 36);
me.screenElements.SpeedTape
.setTranslation(0,ias * 5.711);
settimer(func me.updateIAS(getprop('/velocities/airspeed-kt')), 0.1);
},
};