zkv1000 / Nasal / display.nas /
Sébastien MARQUE animation IAS
d567027 7 years ago
1 contributor
195 lines | 6.605kb
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);
    },
};