zkv1000 / Nasal / softkeys.nas /
Sébastien MARQUE commit initial
56c0030 7 years ago
1 contributor
297 lines | 11.827kb
var softkeysClass = {
    new : func (node, role) {
        var m = { parents: [ softkeysClass ] };
        m.node = node;
        m.role = role;
        m.rootmenu = m.role == 'MFD' ? 16 : 0;
        m.goto(m.rootmenu);
        return m;
    },

    SoftKey : func (n, a) {
        printf("%s softkey %i (%s)", me.role, n, a == 1 ? "pushed" : "released");
#        me._SoftKey[me.rootlevel + me.level][n](a);
    },

    goto: func (l) {
        me.level = l;
    },

    GPS: func { 
        nyi('GPS softkey');
        me.goto(me.rootmenu);
    },

    CDIOFF: func {
        cdi.getNode('visible').setBoolValue(0);
        radios.getNode('nav1-selected').setIntValue(0);
        radios.getNode('nav2-selected').setIntValue(0);
        cdi.getNode('in-range').unalias();
        cdi.getNode('course').unalias();
        cdi.getNode('course-deflection').unalias();
        cdi.getNode('pointer-type').setIntValue(0);
        cdi.getNode('from-flag').unalias();
        var mode = nil;
        mode = getprop('/autopilot/locks/roll');
        if (mode == 'NAV' or mode == 'APR')
            AFCS.ROLL();
        mode = getprop('/autopilot/locks/pitch');
        if (mode == 'GS' or mode == 'APR')
            AFCS.PIT();
        me.goto(me.rootmenu);
    },

    VOR: func (n) {
        radios.getNode('nav' ~ (2-n) ~ '-selected').setIntValue(0);
        radios.getNode('nav' ~ (1+n) ~ '-selected').setIntValue(1);
        CDIfromNAV(n);
        me.goto(me.rootmenu);
    },

    NRST: func {
        var title = me.mud.node.getNode('title').getValue();
        if (substr(title, 0, 8) == 'NEAREST ') {
            me.mud.close();
            me.largeFMSknob = void;
            me.smallFMSknob = void;
        }
        else {
            lockSearches();
            searchNearestNavaid('airport', 10);
            showSearchResults(me.mud, 'NEAREST AIRPORTS', 'mag-bearing-deg', 
                    func { msg('set HDG to ' ~ arg[0][0]);
                        setprop('/instrumentation/zkv1000/afcs/heading-bug-deg', arg[0][0]) 
                    }
            );
            unlockSearches();
            me.smallFMSknob = func (dir) { selectSearchType(me.mud, dir) };
            me.largeFMSknob = func (dir) { me.mud.select(dir) };
        }
    },

    INSETOFF: func { 
        me.newstatus(1);
    },

    TRAFFIC: func {
        if (props.globals.getNode('/instrumentation/radar/serviceable') != nil 
        and props.globals.getNode('/instrumentation/radar/display-controls/tcas') != nil) {
            if (getprop('/instrumentation/radar/serviceable') 
            and getprop('/instrumentation/radar/display-controls/tcas')) {
                me.newstatus(5);
            }
        }
        else {
            msg('unable to find TCAS config, no radar');
            me.goto(me.rootmenu);
        }
    },

    TOPO: func { 
        me.newstatus(2);
        me.node.getNode('mfd-title').setValue('TOPO');
        setprop(me.map_path ~ '/longitude-deg', getprop('/position/longitude-deg'));
        setprop(me.map_path ~ '/latitude-deg', getprop('/position/latitude-deg'));
        me.map.getNode('latitude-deg').alias('/position/latitude-deg');
        me.map.getNode('longitude-deg').alias('/position/longitude-deg');
    },

    TERRAIN: func {
        me.newstatus(3);
        me.node.getNode('mfd-title').setValue('TERR ' ~ mapRanges[getprop(me.map_path ~ '/range-index')]);
        me.map.getNode('latitude-deg').unalias();
        me.map.getNode('longitude-deg').unalias();
        setprop(me.map_path ~ '/longitude-deg', getprop('/position/longitude-deg'));
        setprop(me.map_path ~ '/latitude-deg', getprop('/position/latitude-deg'));
    },

    STRMSCP: func { 
        nyi('STRMSCP softkey');
        me.goto(me.rootmenu);
    },

    NEXRAD: func { 
        nyi('NEXRAD softkey');
        me.goto(me.rootmenu);
    },

    XMLTNG: func { 
        nyi('XMLTNG softkey');
        me.goto(me.rootmenu);
    },

    DCLTROFF: func { 
        nyi('DCLTROFF softkey');
        me.goto(me.rootmenu);
    },

    DCLTR: func (x) { 
        nyi('DCLTR' ~ x ~ ' softkey');
        me.goto(me.rootmenu);
    },

    DFLTS: func { 
        nyi('DEFAULTS softkey');
        me.goto(me.rootmenu);
    },

    DME: func { 
        nyi('DME softkey');
        me.goto(me.rootmenu);
    },

    STDBARO: func { 
        setprop('/instrumentation/altimeter/setting-inhg', 29.92);
        me.goto(me.rootmenu);
    },

    BRG1: func (x) { 
        nyi('BRG1' ~ x ~ ' softkey');
        me.goto(me.rootmenu);
    },

    BRG2: func (x) { 
        nyi('BRG2' ~ x ~ ' softkey');
        me.goto(me.rootmenu);
    },

    BRGOFF: func (x) { 
        nyi('BRGOFF' ~ x ~ ' softkey');
        me.goto(me.rootmenu);
    },

    HSI360: func { 
        me.node.getNode('hsi-360').setBoolValue(1);
        me.goto(me.rootmenu);
    },

    HSIARC: func { 
        me.node.getNode('hsi-360').setBoolValue(0);
        me.goto(me.rootmenu);
    },

    OPTN: func (x) { 
        me.node.getNode('wind-data').setBoolValue(1);
        wind_infos = zkv1000['wind_opt' ~ x];
        me.goto(me.rootmenu);
    },

    WINDOFF: func { 
        wind_infos = void;
        me.node.getNode('wind-data').setBoolValue(1);
        setprop('/instrumentation/zkv1000/infos/wind-line', '');
        setprop('/instrumentation/zkv1000/infos/wind-line[1]', '');
        me.goto(me.rootmenu);
    },

    METERS: func { 
        nyi('METERS softkey');
        me.goto(me.rootmenu);
    },

    IN: func { 
        nyi('IN softkey');
        me.goto(me.rootmenu);
    },

    HPA: func { 
        nyi('HPA softkey');
        me.goto(me.rootmenu);
    },

    ON: func { 
        setprop('/instrumentation/zkv1000/radios/xpdr-mode', 'ON');
        setprop('/instrumentation/transponder/serviceable', 1);
        me.goto(me.rootmenu);
    },

    ALT: func { 
        setprop('/instrumentation/zkv1000/radios/xpdr-mode', 'ALT');
        setprop('/instrumentation/transponder/serviceable', 1);
        me.goto(me.rootmenu);
    },

    GND: func {
        setprop('/instrumentation/zkv1000/radios/xpdr-mode', 'GND');
        setprop('/instrumentation/transponder/serviceable', 1);
        me.goto(me.rootmenu);
    },

    VFR: func { 
        XPDR_old = getprop('/instrumentation/transponder/id-code');
        setprop('/instrumentation/zkv1000/radios/xpdr-mode', 'VFR');
        setprop('/instrumentation/transponder/serviceable', 0);
        me.goto(me.rootmenu);
    },

    XPDR: func (x) {
        if (x <= 7) {
            if (XPDR_n == 3) {
                XPDR_old = getprop('/instrumentation/transponder/id-code');
            }
            elsif (XPDR_n < 0) {
                me.goto(10);
                XPDR_n = 3;
                return;
            }
            else {
                setprop('/instrumentation/transponder/id-code', x * math.pow(10, XPDR_n));
                XPDR_n -= 1;
            }
        }
        else {
            if (x == 9) setprop('/instrumentation/transponder/id-code', XPDR_old);
            XPDR_n = 3;
            me.goto(me.rootmenu);
        }
    },

    CODE: func {
        getprop('/instrumentation/zkv1000/radios/xpdr-mode') == 'STBY' or return;
        me.largeFMSknob = func (x) { 
            XPDR_change_cursor_position(x); 
            settimer(func { me.ENTsoftkey(1) }, 10); 
        }
        me.smallFMSknob = func (x) { 
            XPDR_enter_digits(x);
            settimer(func { me.ENTsoftkey(1) }, 10); 
        }
        me.goto(11);
    },

    TMRREF: func (ref) { 
        time = zkv1000['time' ~ ref];
        me.goto(me.rootmenu);
    },

    CHRON: func {
        fgcommand('dialog-show', props.Node.new({
            'dialog-name': 'stopwatch-dialog',
        }));
        me.goto(me.rootmenu);
    },

    set_softkeyActionTable: func {
        me.softkeyActionTable = [
            [void,               func{me.goto(2)},void,             func{me.goto(4)},  void,              func{me.goto(1)},  ADFDME,            func{me.goto(10)},IDENT,            func{me.goto(17)}, func{me.NRST()}],
            [void,               func{me.VOR(0)}, func{me.VOR(1)},  func{me.GPS()},    void,              void,              func{me.CDIOFF()}, void,             void,             void,              func{me.goto(me.rootmenu)}],
            [func{me.INSETOFF()},func{me.goto(3)},void,             func{me.TRAFFIC()},func{me.TOPO()},   func{me.TERRAIN()},func{me.STRMSCP()},func{me.NEXRAD()},func{me.XMLTNG()},void,              func{me.goto(me.rootmenu)}],
            [func{me.DCLTROFF()},void,            func{me.DCLTR(1)},func{me.DCLTR(2)}, func{me.DCLTR(3)}, void,              void,              void,             void,             void,              func{me.goto(2)}],
            [LIGHT,              func{me.DFLTS()},func{me.goto(8)}, func{me.DME()},    func{me.goto(5)},  func{me.goto(7)},  func{me.goto(6)},  void,             func{me.goto(9)}, func{me.STDBARO()},func{me.goto(me.rootmenu)}],
            [func{me.BRG1(1)},   func{me.BRG1(2)},func{me.BRG1(3)}, void,              func{me.BRGOFF(1)},void,              void,              void,             void,             void,              func{me.goto(4)}],
            [func{me.BRG2(1)},   func{me.BRG2(2)},func{me.BRG2(3)}, void,              func{me.BRGOFF(2)},void,              void,              void,             void,             void,              func{me.goto(4)}],
            [void,               void,            void,             void,              void,              func{me.HSI360()}, func{me.HSIARC()}, void,             void,             void,              func{me.goto(4)}],
            [void,               void,            func{me.OPTN(1)}, func{me.OPTN(2)},  func{me.OPTN(3)},  void,              func{me.WINDOFF()},void,             void,             void,              func{me.goto(4)}],
            [void,               void,            void,             void,              void,              func{me.METERS()}, void,              func{me.IN()},    func{me.HPA()},   void,              func{me.goto(4)}],
            [void,               void,            STDBY,            func{me.ON()},     func{me.ALT()},    func{me.GND()},    func{me.VFR()},    func{me.CODE()},  IDENT,            void,              func{me.goto(me.rootmenu)}],
            [func{me.XPDR(0)},   func{me.XPDR(1)},func{me.XPDR(2)}, func{me.XPDR(3)},  func{me.XPDR(4)},  func{me.XPDR(5)},  func{me.XPDR(6)},  func{me.XPDR(7)}, func{me.XPDR(8)}, BKSP,              func{me.XPDR(9)}],
            [func{me.newstatus(1)},func{me.goto(15)},void,          func{me.goto(14)}, void,              func{me.goto(13)}, void,              CHECKLIST,        void,             void,              void],
            [void,               void,            func{me.DCLTR(1)},void,              func{me.DCLTR(2)}, void,              func{me.DCLTR(3)}, void,             void,             void,              func{me.goto(me.rootmenu)}],
            [void,               void,            void,             func{me.TRAFFIC()},func{me.TOPO()},   func{me.TERRAIN()},func{me.STRMSCP()},func{me.NEXRAD()},func{me.XMLTNG()},void,              func{me.goto(me.rootmenu)}],
            [func{me.goto(me.rootmenu)},void,     LEAN,             void,              void,              void,              func{FUEL(1)},     func{FUEL(2)},    func{FUEL(3)},    void,              void],
            [func{me.newstatus(2)},func{me.goto(2)},void,             func{me.goto(4)},  void,              func{me.goto(1)},  ADFDME,            func{me.goto(10)},IDENT,            func{me.goto(17)}, func{me.NRST()}],
            [func{me.TMRREF('LCL')},func{me.TMRREF('UTC')},void,    func{me.TMRREF('RL')},void,           func{me.CHRON()},  void,              void,             void,             void,              func{me.goto(me.rootmenu)}],
        ];
    },

};