zkv1000 / Nasal / softkeys.nas /
Newer Older
999 lines | 51.832kb
massive code reorganisation ...
Sébastien MARQUE authored on 2017-05-01
1
# vim: set foldmethod=marker foldmarker={{{,}}} :
commit initial
Sébastien MARQUE authored on 2017-03-07
2
var softkeysClass = {
improves role/name variables...
Sébastien MARQUE authored on 2017-04-08
3
    new : func (device) {
commit initial
Sébastien MARQUE authored on 2017-03-07
4
        var m = { parents: [ softkeysClass ] };
softkeys are available now
Sébastien MARQUE authored on 2017-03-14
5
        m.device = device;
6
        m.path = [];
improves softkeys coloring
Sébastien MARQUE authored on 2017-04-15
7
        m.colored = {};
commit initial
Sébastien MARQUE authored on 2017-03-07
8
        return m;
9
    },
10

            
softkeys are available now
Sébastien MARQUE authored on 2017-03-14
11
    SoftKey : func (n, a) {
12
        # released key not yet managed
13
        if (a == 1)
14
            return;
15

            
16
        var key = me.device.display.screenElements[sprintf("SoftKey%02i-text",n)].get('text');
17
        if (key == '' or key == nil)
18
            return;
19

            
improves role/name variables...
Sébastien MARQUE authored on 2017-04-08
20
        var path = keyMap[me.device.role];
softkeys are available now
Sébastien MARQUE authored on 2017-03-14
21
        foreach(var p; me.path) {
22
            if (contains(path, p))
23
                path = path[p];
24
            else
25
                break;
commit initial
Sébastien MARQUE authored on 2017-03-07
26
        }
27

            
improves role/name variables...
Sébastien MARQUE authored on 2017-04-08
28
        var bindings = me.bindings[me.device.role];
softkeys are available now
Sébastien MARQUE authored on 2017-03-14
29
        foreach(var p; me.path) {
30
            if (contains(bindings, p))
31
                bindings = bindings[p];
32
            else
33
                break;
commit initial
Sébastien MARQUE authored on 2017-03-07
34
        }
35

            
softkeys are available now
Sébastien MARQUE authored on 2017-03-14
36
        if (contains(path, key)) {
37
            append(me.path, key);
fix issue with some menus
Sébastien MARQUE authored on 2017-03-20
38
            if (contains(bindings, key))
39
                if (contains(bindings[key], 'hook'))
40
                    call(bindings[key].hook, [], me);
softkeys are available now
Sébastien MARQUE authored on 2017-03-14
41
            me.device.display.updateSoftKeys();
commit initial
Sébastien MARQUE authored on 2017-03-07
42
        }
softkeys are available now
Sébastien MARQUE authored on 2017-03-14
43
        elsif (contains(bindings, key)) {
44
            call(bindings[key], [], me);
commit initial
Sébastien MARQUE authored on 2017-03-07
45
        }
softkeys are available now
Sébastien MARQUE authored on 2017-03-14
46
        elsif (key == 'BACK') {
47
            pop(me.path);
48
            me.device.display.updateSoftKeys();
commit initial
Sébastien MARQUE authored on 2017-03-07
49
        }
show the complete path menu ...
Sébastien MARQUE authored on 2017-03-20
50
        else {
51
            var list_path = '';
52
            foreach(var p; me.path) list_path ~= p ~ '/';
53
            print(me.device.role ~ ':' ~ list_path ~ key ~ ' : not yet implemented');
54
        }
softkeys are available now
Sébastien MARQUE authored on 2017-03-14
55
    },
56

            
57
    bindings : {
58
        PFD : {
59
            INSET: {
60
                OFF: func {
separates maps code
Sébastien MARQUE authored on 2017-05-11
61
                    me.device.map.setVisible(0);
PFD INSET map available
Sébastien MARQUE authored on 2017-04-19
62
                    me.device.display.screenElements['PFD-Map-bg'].hide();
63
                },
add TCAS
Sébastien MARQUE authored on 2017-12-21
64
                TRAFFIC: func {
improve the selection of dis...
Sébastien MARQUE authored on 2017-12-30
65
                    call(me.bindings.PFD.INSET.declutter, ['INSETTRAFFIC', 'tcas', 2], me);
66
                },
67
                ROUTE: func {
68
                    call(me.bindings.PFD.INSET.declutter, ['INSETROUTE', 'route', 3], me);
69
                },
70
                TERRAIN: func {
71
                    call(me.bindings.PFD.INSET.declutter, ['INSETTERRAIN', 'tiles', 5], me);
72
                },
73
                NAVAIDS: {
74
                    ALL: func (root_id = 'INSETNAVAIDS') {
75
                        if (contains(me.colored, root_id ~ 'ALL'))
76
                            foreach (var n; [ 'ALL', 'VOR', 'DME', 'NDB', 'TACAN', 'APT' ])
77
                                delete(me.colored, root_id ~ n);
78
                        else
79
                            foreach (var n; [ 'ALL', 'VOR', 'DME', 'NDB', 'TACAN', 'APT' ])
80
                                me.colored[root_id ~ n] = 1;
81
                        me.device.display.updateSoftKeys();
82
                        foreach (var n; [ 'VOR', 'TACAN', 'NDB', 'DME' ])
83
                            me.device.map.layers.navaids._can[n]
84
                                .setVisible(contains(me.colored, root_id ~ n));
85
                        me.device.map.layers.navaids._can.airport
86
                            .setVisible(contains(me.colored, root_id ~ 'APT'));
87
                    },
88
                    VOR: func {
89
                        call(me.bindings.PFD.INSET.NAVAIDS.declutter, ['INSETNAVAIDSVOR', 'VOR', 2], me);
90
                    },
91
                    TACAN: func {
92
                        call(me.bindings.PFD.INSET.NAVAIDS.declutter, ['INSETNAVAIDSTACAN', 'TACAN', 3], me);
93
                    },
94
                    NDB: func {
95
                        call(me.bindings.PFD.INSET.NAVAIDS.declutter, ['INSETNAVAIDSNDB', 'NDB', 4], me);
96
                    },
97
                    DME: func {
98
                        call(me.bindings.PFD.INSET.NAVAIDS.declutter, ['INSETNAVAIDSDME', 'DME', 5], me);
99
                    },
100
                    APT: func {
101
                        call(me.bindings.PFD.INSET.NAVAIDS.declutter, ['INSETNAVAIDSAPT', 'airport', 6], me);
102
                    },
103
                    declutter: func (id, type) {
104
                        if (contains(me.colored, id)) {
105
                            delete(me.colored, id);
106
                            if (me.device.role == 'PFD')
107
                                delete(me.colored, 'INSETNAVAIDSALL');
108
                            if (me.device.role == 'MFD')
109
                                delete(me.colored, 'MAPNAVAIDSALL');
110
                        }
111
                        else
112
                            me.colored[id] = 1;
113
                        me.device.display.updateSoftKeys();
114
                        me.device.map.layers.navaids._can[type]
115
                            .setVisible(contains(me.colored, id));
116
                    },
117
                },
118
                declutter: func (id, layer) {
119
                    if (contains(me.colored, id))
120
                        delete(me.colored, id);
add TCAS
Sébastien MARQUE authored on 2017-12-21
121
                    else
improve the selection of dis...
Sébastien MARQUE authored on 2017-12-30
122
                        me.colored[id] = 1;
add TCAS
Sébastien MARQUE authored on 2017-12-21
123
                    me.device.display.updateSoftKeys();
improve the selection of dis...
Sébastien MARQUE authored on 2017-12-30
124
                    me.device.map.layers[layer]
125
                        .setVisible(contains(me.colored, id));
add TCAS
Sébastien MARQUE authored on 2017-12-21
126
                },
PFD INSET map available
Sébastien MARQUE authored on 2017-04-19
127
                hook : func {
128
                    me.device.display.screenElements['PFD-Map-bg'].show();
separates maps code
Sébastien MARQUE authored on 2017-05-11
129
                    me.device.map.setVisible(1);
130
                    me.device.map.update();
softkeys are available now
Sébastien MARQUE authored on 2017-03-14
131
                },
132
            },
133
            PFD: {
adds OAT, TAS, GSPD, WindDat...
Sébastien MARQUE authored on 2017-03-15
134
                'AOA/WIND' : {
adds AOA display
Sébastien MARQUE authored on 2017-04-15
135
                    AOA : {
136
                        'AOA ON' : func {
137
                            if (me.device.data['aoa-auto'])
138
                                return;
139
                            me.device.data.aoa = ! me.device.data.aoa;
nicer AOA display
Sébastien MARQUE authored on 2017-04-16
140
                            foreach (var e; ['AOA', 'AOA-needle', 'AOA-text'])
141
                                me.device.display.screenElements[e]
142
                                    .setVisible(me.device.data.aoa);
143
                            me.device.display.screenElements['AOA-approach']
144
                                .setVisible(me.device.data.aoa and contains(data, 'approach-aoa'));
adds AOA display
Sébastien MARQUE authored on 2017-04-15
145
                            me.device.display.updateAOA();
146
                            me.device.display.setSoftKeyColor(5 ,me.device.data.aoa);
147
                            if (me.device.data.aoa)
148
                                me.colored['PFDAOA/WINDAOAAOA ON'] = 1;
149
                            else
150
                                delete(me.colored, 'PFDAOA/WINDAOAAOA ON');
151
                        },
152
                        'AOA AUTO' : func {
153
                            if (me.device.data.aoa)
154
                                return;
155
                            me.device.data['aoa-auto'] = ! me.device.data['aoa-auto'];
156
                            me.device.display.setSoftKeyColor(6 ,me.device.data['aoa-auto']);
157
                            if (me.device.data['aoa-auto']) {
158
                                me.colored['PFDAOA/WINDAOAAOA AUTO'] = 1;
159
                                if (!contains(me.device.timers, 'aoa'))
160
                                    me.device.timers.aoa = maketimer(1,
161
                                            func {
162
                                                var v = getprop('/gear/gear/position-norm') == 1
163
                                                    and getprop('/surfaces-positions/flap-pos-norm') != 0;
nicer AOA display
Sébastien MARQUE authored on 2017-04-16
164
                                                foreach (var e; ['AOA', 'AOA-needle', 'AOA-text'])
165
                                                    me.device.display.screenElements[e]
166
                                                        .setVisible(v);
167
                                                me.device.display.screenElements['AOA-approach']
168
                                                    .setVisible(v and contains(data, 'approach-aoa'));
adds AOA display
Sébastien MARQUE authored on 2017-04-15
169
                                            }, me);
170
                                me.device.timers.aoa.start();
171
                            }
172
                            else {
173
                                delete(me.colored, 'PFDAOA/WINDAOAAOA AUTO');
174
                                me.device.timers.aoa.stop();
175
                                me.device.data.aoa = 0;
176
                                me.device.display.screenElements['AOA']
177
                                    .hide();
178
                            }
179
                        },
nicer AOA display
Sébastien MARQUE authored on 2017-04-16
180
                        hook : func {
181
                            if (contains(data,'approach-aoa'))
182
                                me.device.display.screenElements['AOA-approach']
183
                                    .setRotation(-data['approach-aoa']/data['stall-aoa']*math.pi);
184
                        },
adds AOA display
Sébastien MARQUE authored on 2017-04-15
185
                    },
adds OAT, TAS, GSPD, WindDat...
Sébastien MARQUE authored on 2017-03-15
186
                    WIND : {
187
                        OPTN1 : func {
188
                            me.device.display._winddata_optn = 1;
189
                            me.device.display.screenElements['WindData'].show();
190
                            me.device.display.screenElements['WindData-OPTN1'].show();
191
                            me.device.display.screenElements['WindData-OPTN1-HDG'].show();
192
                            me.device.display.screenElements['WindData-OPTN2'].hide();
193
                            me.device.display.updateWindData();
uses the new coloration for ...
Sébastien MARQUE authored on 2017-04-15
194
                            me.device.display.setSoftKeyColor(2, 1);
195
                            me.colored['PFDAOA/WINDWINDOPTN1'] = 1;
196
                            me.device.display.setSoftKeyColor(3, 0);
197
                            delete(me.colored, 'PFDAOA/WINDWINDOPTN2');
adds OAT, TAS, GSPD, WindDat...
Sébastien MARQUE authored on 2017-03-15
198
                        },
199
                        OPTN2 : func {
200
                            me.device.display._winddata_optn = 2;
201
                            me.device.display.screenElements['WindData'].show();
202
                            me.device.display.screenElements['WindData-OPTN1'].hide();
203
                            me.device.display.screenElements['WindData-OPTN2'].show();
204
                            me.device.display.screenElements['WindData-OPTN2-symbol'].show();
205
                            me.device.display.screenElements['WindData-OPTN2-headwind'].show();
206
                            me.device.display.screenElements['WindData-OPTN2-crosswind'].show();
207
                            me.device.display.updateWindData();
uses the new coloration for ...
Sébastien MARQUE authored on 2017-04-15
208
                            me.device.display.setSoftKeyColor(2, 0);
209
                            delete(me.colored, 'PFDAOA/WINDWINDOPTN1');
210
                            me.device.display.setSoftKeyColor(3, 1);
211
                            me.colored['PFDAOA/WINDWINDOPTN2'] = 1;
adds OAT, TAS, GSPD, WindDat...
Sébastien MARQUE authored on 2017-03-15
212
                        },
213
                        OFF : func {
214
                            me.device.display._winddata_optn = 0;
215
                            me.device.display.screenElements['WindData'].hide();
216
                            me.device.display.screenElements['WindData-OPTN1'].hide();
217
                            me.device.display.screenElements['WindData-OPTN2'].hide();
uses the new coloration for ...
Sébastien MARQUE authored on 2017-04-15
218
                            me.device.display.setSoftKeyColor(2, 0);
219
                            delete(me.colored, 'PFDAOA/WINDWINDOPTN1');
220
                            me.device.display.setSoftKeyColor(3, 0);
221
                            delete(me.colored, 'PFDAOA/WINDWINDOPTN2');
adds OAT, TAS, GSPD, WindDat...
Sébastien MARQUE authored on 2017-03-15
222
                        },
223
                    },
224
                },
adds BRG1/2 animation
Sébastien MARQUE authored on 2017-03-16
225
                BRG1 : func (brg = 1){
226
                    var source = 'brg' ~ brg ~ '-source';
227
                    var list = ['NAV' ~ brg, 'GPS', 'ADF', 'OFF'];
228
                    var index = std.Vector
229
                                   .new(list)
230
                                   .index(radios.getNode(source).getValue());
231
                    var next = (index == size(list) -1) ?  0 : index + 1;
232
                    radios.getNode(source).setValue(list[next]);
uses the new coloration for ...
Sébastien MARQUE authored on 2017-04-15
233
                    if (list[next] != 'OFF') {
234
                        me.device.display.setSoftKeyColor(brg == 1 ? 4 : 6, 1);
235
                        me.colored['PFDBRG' ~ brg] = 1;
236
                    }
237
                    else {
238
                        me.device.display.setSoftKeyColor(brg == 1 ? 4 : 6, 0);
239
                        delete(me.colored, 'PFDBRG' ~ brg);
240
                    }
adds BRG1/2 animation
Sébastien MARQUE authored on 2017-03-16
241
                },
242
                BRG2 : func {
243
                    call(me.bindings.PFD.PFD.BRG1, [ 2 ], me);
244
                },
adds BARO settings
Sébastien MARQUE authored on 2017-03-20
245
                'STD BARO' : func {
246
                    setprop('/instrumentation/altimeter/setting-inhg', 29.92);
247
                    me.device.display.updateBARO();
248
                    pop(me.path);
249
                    me.device.display.updateSoftKeys();
250
                },
251
                IN :  func {
252
                    me.device.display._baro_unit = 'inhg';
253
                    me.device.display.updateBARO();
254
                },
255
                HPA : func {
256
                    me.device.display._baro_unit = 'hpa';
257
                    me.device.display.updateBARO();
258
                },
softkeys are available now
Sébastien MARQUE authored on 2017-03-14
259
            },
260
            XPDR: {
adds transponder
Sébastien MARQUE authored on 2017-03-17
261
                STBY : func {
262
                    setprop('/instrumentation/transponder/ident', 0);
263
                    setprop('/instrumentation/transponder/knob-mode', 1);
remove hardcoded properties ...
Sébastien MARQUE authored on 2020-04-27
264
                    radios.setValue('xpdr-mode', 'STBY');
adds transponder
Sébastien MARQUE authored on 2017-03-17
265
                    me.device.display.updateXPDR();
266
                },
267
                ON : func {
268
                    setprop('/instrumentation/transponder/ident', 1);
269
                    setprop('/instrumentation/transponder/knob-mode', 4);
remove hardcoded properties ...
Sébastien MARQUE authored on 2020-04-27
270
                    radios.setValue('xpdr-mode', 'ON');
adds transponder
Sébastien MARQUE authored on 2017-03-17
271
                    me.device.display.updateXPDR();
272
                },
273
                ALT : func {
274
                    setprop('/instrumentation/transponder/ident', 1);
275
                    setprop('/instrumentation/transponder/knob-mode', 5);
remove hardcoded properties ...
Sébastien MARQUE authored on 2020-04-27
276
                    radios.setValue('xpdr-mode', 'ALT');
adds transponder
Sébastien MARQUE authored on 2017-03-17
277
                    me.device.display.updateXPDR();
278
                },
279
                VFR : func {
280
                    setprop('/instrumentation/transponder/id-code', '1200');
281
                    me.device.display.updateXPDR();
282
                },
283
                IDENT : func {
284
                    call(me.bindings.PFD.IDENT, [], me);
285
                },
286
                CODE : {
287
                    '0' : func (n = 0) {
remove hardcoded properties ...
Sébastien MARQUE authored on 2020-04-27
288
                        if (radios.getValue('xpdr-tuning-fms-method'))
XPDR settings via knob or so...
Sébastien MARQUE authored on 2017-03-22
289
                            return;
290
                        me.device.display.timers2.softkeys_inactivity.stop();
Softkeys revert to the previ...
Sébastien MARQUE authored on 2017-03-21
291
                        me.bindings.PFD.XPDR.CODE.inactivity.restart(me.device.display.softkeys_inactivity_delay);
XPDR settings via knob or so...
Sébastien MARQUE authored on 2017-03-22
292
                        # disable FMS knob entering method
293
                        me.device.knobs.FmsInner = void;
294
                        # When entering the code, the next softkey in sequence
295
                        # must be pressed within 10 seconds, or the entry is cancelled
296
                        # and restored to the previous code
297
                        if (!contains(me.bindings.PFD.XPDR.CODE, 'on_change_inactivity')) {
298
                            me.bindings.PFD.XPDR.CODE.on_change_inactivity = maketimer(10,
299
                                func {
remove hardcoded properties ...
Sébastien MARQUE authored on 2020-04-27
300
                                    radios.setValue('xpdr-tuning-digit', 3);
XPDR settings via knob or so...
Sébastien MARQUE authored on 2017-03-22
301
                                    me.device.knobs.FmsInner = me.device.knobs.XPDRCodeSetDigits;
302
                                    me.device.knobs.FmsOuter = me.device.knobs.XPDRCodeNextDigits;
303
                                    call(me.bindings.PFD.XPDR.CODE.restore, [], me);
304
                                });
305
                            me.bindings.PFD.XPDR.CODE.on_change_inactivity.singleShot = 1;
306
                            me.bindings.PFD.XPDR.CODE.on_change_inactivity.start();
307
                        }
308
                        else
309
                            me.bindings.PFD.XPDR.CODE.on_change_inactivity.restart(10);
adds transponder
Sébastien MARQUE authored on 2017-03-17
310
                        var tuning = radios.getNode('xpdr-tuning-digit');
311
                        var d = tuning.getValue();
312
                        setprop('/instrumentation/transponder/inputs/digit[' ~ d ~ ']', n);
XPDR settings via knob or so...
Sébastien MARQUE authored on 2017-03-22
313
                        if (d == 1) {
314
                            if (!contains(me.bindings.PFD.XPDR.CODE, 'on_change_auto_validation'))
315
                                me.bindings.PFD.XPDR.CODE.on_change_auto_validation = maketimer(5,
316
                                    func call(me.bindings.PFD.IDENT, [], me));
317
                            me.bindings.PFD.XPDR.CODE.on_change_auto_validation.singleShot = 1;
318
                            me.bindings.PFD.XPDR.CODE.on_change_auto_validation.start();
319
                        }
320
                        else {
321
                            d -= 1;
322
                            tuning.setValue(d);
323
                        }
adds transponder
Sébastien MARQUE authored on 2017-03-17
324
                        me.device.display.updateXPDR();
325
                    },
326
                    '1' : func {
327
                        call(me.bindings.PFD.XPDR.CODE['0'], [ 1 ], me);
328
                    },
329
                    '2' : func {
330
                        call(me.bindings.PFD.XPDR.CODE['0'], [ 2 ], me);
331
                    },
332
                    '3' : func {
333
                        call(me.bindings.PFD.XPDR.CODE['0'], [ 3 ], me);
334
                    },
335
                    '4' : func {
336
                        call(me.bindings.PFD.XPDR.CODE['0'], [ 4 ], me);
337
                    },
338
                    '5' : func {
339
                        call(me.bindings.PFD.XPDR.CODE['0'], [ 5 ], me);
340
                    },
341
                    '6' : func {
342
                        call(me.bindings.PFD.XPDR.CODE['0'], [ 6 ], me);
343
                    },
344
                    '7' : func {
345
                        call(me.bindings.PFD.XPDR.CODE['0'], [ 7 ], me);
346
                    },
softkeys are available now
Sébastien MARQUE authored on 2017-03-14
347
                    IDENT: func {
Softkeys revert to the previ...
Sébastien MARQUE authored on 2017-03-21
348
                        me.bindings.PFD.XPDR.CODE.inactivity.restart(me.device.display.softkeys_inactivity_delay);
349
                        me.device.display.timers2.softkeys_inactivity.restart(me.device.display.softkeys_inactivity_delay);
adds transponder
Sébastien MARQUE authored on 2017-03-17
350
                        call(me.bindings.PFD.IDENT, [], me);
351
                    },
352
                    BKSP: func {
remove hardcoded properties ...
Sébastien MARQUE authored on 2020-04-27
353
                        if (radios.getValue('xpdr-tuning-fms-method'))
XPDR settings via knob or so...
Sébastien MARQUE authored on 2017-03-22
354
                            return;
355
                        if (contains(me.bindings.PFD.XPDR.CODE, 'on_change_inactivity'))
356
                            me.bindings.PFD.XPDR.CODE.on_change_inactivity.restart(10);
357
                        if (contains(me.bindings.PFD.XPDR.CODE, 'on_change_auto_validation'))
358
                                me.bindings.PFD.XPDR.CODE.on_change_auto_validation.stop();
adds transponder
Sébastien MARQUE authored on 2017-03-17
359
                        var tuning = radios.getNode('xpdr-tuning-digit');
360
                        var d = tuning.getValue();
XPDR settings via knob or so...
Sébastien MARQUE authored on 2017-03-22
361
                        if (d < 3) {
362
                            d += 1;
363
                            tuning.setValue(d);
364
                        }
adds transponder
Sébastien MARQUE authored on 2017-03-17
365
                        me.device.display.updateXPDR();
softkeys are available now
Sébastien MARQUE authored on 2017-03-14
366
                    },
adds transponder
Sébastien MARQUE authored on 2017-03-17
367
                    BACK : func (inactive = 0) {
XPDR settings via knob or so...
Sébastien MARQUE authored on 2017-03-22
368
                        call(me.bindings.PFD.XPDR.CODE.restore, [], me);
adds transponder
Sébastien MARQUE authored on 2017-03-17
369
                        pop(me.path);
XPDR settings via knob or so...
Sébastien MARQUE authored on 2017-03-22
370
                        call(me.bindings.PFD.XPDR.CODE.exit, [me.path], me);
371
                    },
372
                    restore : func {
373
                        setprop('/instrumentation/transponder/id-code',
remove hardcoded properties ...
Sébastien MARQUE authored on 2020-04-27
374
                            sprintf('%s', radios.getValue('xpdr-backup-code')));
XPDR settings via knob or so...
Sébastien MARQUE authored on 2017-03-22
375
                        me.device.display.updateXPDR();
adds transponder
Sébastien MARQUE authored on 2017-03-17
376
                    },
377
                    exit : func (p) {
Softkeys revert to the previ...
Sébastien MARQUE authored on 2017-03-21
378
                        if (contains(me.bindings.PFD.XPDR.CODE, 'inactivity')) # does not exists if IDENT pressed from top-level
379
                            me.bindings.PFD.XPDR.CODE.inactivity.stop();
adds transponder
Sébastien MARQUE authored on 2017-03-17
380
                        radios.removeChild('xpdr-tuning-digit', 0);
381
                        radios.removeChild('xpdr-backup-code', 0);
XPDR settings via knob or so...
Sébastien MARQUE authored on 2017-03-22
382
                        radios.removeChild('xpdr-tuning-fms-method', 0);
adds transponder
Sébastien MARQUE authored on 2017-03-17
383
                        me.path = p;
384
                        me.device.display.updateXPDR();
softkeys are available now
Sébastien MARQUE authored on 2017-03-14
385
                        me.device.display.updateSoftKeys();
XPDR settings via knob or so...
Sébastien MARQUE authored on 2017-03-22
386
                        me.device.knobs.FmsInner = void;
387
                        me.device.knobs.FmsOuter = void;
388
                        me.device.display.timers2.softkeys_inactivity.restart(me.device.display.softkeys_inactivity_delay);
softkeys are available now
Sébastien MARQUE authored on 2017-03-14
389
                    },
adds transponder
Sébastien MARQUE authored on 2017-03-17
390
                    hook : func {
XPDR settings via knob or so...
Sébastien MARQUE authored on 2017-03-22
391
                        # this level has its own timer as we may need to revert changes, and got different timers
392
                        me.device.display.timers2.softkeys_inactivity.stop();
Softkeys revert to the previ...
Sébastien MARQUE authored on 2017-03-21
393
                        me.bindings.PFD.XPDR.CODE.inactivity = maketimer(
394
                            me.device.display.softkeys_inactivity_delay,
XPDR settings via knob or so...
Sébastien MARQUE authored on 2017-03-22
395
                            func call(me.bindings.PFD.XPDR.CODE.BACK, [], me));
Softkeys revert to the previ...
Sébastien MARQUE authored on 2017-03-21
396
                        me.bindings.PFD.XPDR.CODE.inactivity.singleShot = 1;
397
                        me.bindings.PFD.XPDR.CODE.inactivity.start();
remove hardcoded properties ...
Sébastien MARQUE authored on 2020-04-27
398
                        var tuning = radios.getValue('xpdr-tuning-digit');
adds transponder
Sébastien MARQUE authored on 2017-03-17
399
                        if (tuning == nil) {
400
                            radios.getNode('xpdr-tuning-digit', 1).setValue(3);
401
                            radios.getNode('xpdr-backup-code', 1).setValue(getprop('/instrumentation/transponder/id-code'));
XPDR settings via knob or so...
Sébastien MARQUE authored on 2017-03-22
402
                            radios.getNode('xpdr-tuning-fms-method', 1).setValue(0);
adds transponder
Sébastien MARQUE authored on 2017-03-17
403
                            me.device.display.updateXPDR();
404
                        }
XPDR settings via knob or so...
Sébastien MARQUE authored on 2017-03-22
405
                        me.device.knobs.FmsInner = me.device.knobs.XPDRCodeSetDigits;
406
                        me.device.knobs.FmsOuter = me.device.knobs.XPDRCodeNextDigits;
adds transponder
Sébastien MARQUE authored on 2017-03-17
407
                    },
softkeys are available now
Sébastien MARQUE authored on 2017-03-14
408
                },
adds transponder
Sébastien MARQUE authored on 2017-03-17
409
            },
410
            IDENT : func {
remove hardcoded properties ...
Sébastien MARQUE authored on 2020-04-27
411
                if (radios.getValue('xpdr-mode') == 'STBY')
adds transponder
Sébastien MARQUE authored on 2017-03-17
412
                    return;
413
                setprop('/instrumentation/transponder/ident', 1);
414
                me.bindings.PFD.XPDR.ident = maketimer(18,
415
                        func {
416
                            setprop('/instrumentation/transponder/ident', 0);
417
                            me.device.display.updateXPDR();
418
                        });
419
                me.bindings.PFD.XPDR.ident.singleShot = 1;
420
                me.bindings.PFD.XPDR.ident.start();
XPDR settings via knob or so...
Sébastien MARQUE authored on 2017-03-22
421
                call(me.bindings.PFD.XPDR.CODE.exit, [], me);
softkeys are available now
Sébastien MARQUE authored on 2017-03-14
422
            },
adds CDI
Sébastien MARQUE authored on 2017-03-18
423
            CDI : func {
424
                var list = ['OFF'];
425
                if (getprop('/instrumentation/gps/route-distance-nm') != nil)
426
                    append(list, 'GPS');
427
                if (getprop('/instrumentation/nav/in-range') != nil)
428
                    append(list, 'NAV1');
429
                if (getprop('/instrumentation/nav[1]/in-range') != nil)
430
                    append(list, 'NAV2');
431
                var index = std.Vector
432
                               .new(list)
433
                               .index(cdi.getNode('source').getValue());
434
                var next = (index == size(list) -1) ?  0 : index + 1;
435
                cdi.getNode('source').setValue(list[next]);
436
                CDIfromSOURCE(list[next]);
437
                me.device.display.updateCDI();
438
            },
TMR/REF window
Sébastien MARQUE authored on 2017-03-28
439
            'TMR/REF' : func {
440
                if (!contains(me.device.windows.state, 'TMR/REF')) {
TMR/REF available
Sébastien MARQUE authored on 2017-04-10
441
                    var Vspeed_visiblity = func (id, selected, Vspeed)
442
                        me.device.data[Vspeed ~ '-visible'] =
443
                            me.device.windows.state[id].objects[selected].text
444
                            ==
445
                            me.device.windows.state[id].objects[selected].choices[0];
446
                    var GenericTimer = func (id, selected) {
447
                        var action = me.device.windows.state[id].objects[selected].text;
448
                        if (action == 'START?') {
449
                            me.device.data.TMRrevert = 0;
450
                            me.device.data.TMRlast = getprop('/sim/time/elapsed-sec') - 1;
451
                            me.device.data.TMRreset = me.device.windows.state[id].objects[selected - 2].text;
452
                            me.device.data.TMRtimer = maketimer(1, func {
453
                                    var (hh, mm, ss) = split(':',
454
                                            me.device.windows.state[id].objects[selected - 2].text);
455
                                    var direction = -1;
456
                                    if ((me.device.windows.state[id].objects[selected - 1].text
457
                                            ==
458
                                        me.device.windows.state[id].objects[selected - 1].choices[0])
459
                                    or me.device.data.TMRrevert)
460
                                        direction = 1;
461
                                    var now = getprop('/sim/time/elapsed-sec');
462
                                    var dt = int(now - me.device.data.TMRlast) * direction;
463
                                    me.device.data.TMRlast = now;
464
                                    var val = HMS(hh, mm, ss, dt);
465
                                    me.device.windows.state[id].objects[selected - 2].text = val;
466
                                    me.device.windows.window[id ~ '-' ~ (selected -2)]
467
                                        .setText(val);
468
                                    if (val == '00:00:00' and direction == -1)
469
                                        me.device.data.TMRrevert = 1;
470
                                }, me);
471
                            me.device.data.TMRtimer.start();
472
                            action = 'STOP?';
473
                        }
474
                        elsif (action == 'STOP?') {
475
                            me.device.data.TMRtimer.stop();
476
                            action = 'RESET?';
477
                        }
478
                        elsif (action == 'RESET?') {
479
                            action = 'START?';
480
                            if ((me.device.windows.state[id].objects[selected - 1].text
481
                                        ==
482
                                me.device.windows.state[id].objects[selected - 1].choices[1])
483
                            and !me.device.data.TMRrevert)
484
                                var val = me.device.data.TMRreset;
485
                            else
486
                                var val = '00:00:00';
487
                            me.device.windows.state[id].objects[selected - 2].text = val;
488
                            me.device.windows.window[id ~ '-' ~ (selected -2)]
489
                                .setText(val);
490
                        }
491
                        me.device.windows.window[me.device.windows.selected]
492
                            .setText(action);
493
                        me.device.windows.state[id].objects[selected].text = action;
494
                    };
TMR/REF window
Sébastien MARQUE authored on 2017-03-28
495
                    me.device.windows.draw(
496
                        'TMR/REF',
497
                        {x: 720, y: 535, w: 300, l: 5, sep: 3},
TMR/REF window adaptation
Sébastien MARQUE authored on 2017-04-02
498
                        [ # objects infos
TMR/REF window
Sébastien MARQUE authored on 2017-03-28
499
                            {text: 'REFERENCES', type: 'title'},
500
                            {type: 'separator'},
501
                            {text: 'TIMER', type: 'normal'},
502
                            {text: '00:00:00', type: 'selected|time', },
TMR/REF available
Sébastien MARQUE authored on 2017-04-10
503
                            {text: '  UP >', type: 'editable', choices: ['  UP >', '<DOWN ']},
504
                            {text: 'START?', type: 'editable|end-of-line', callback: func (id, selected) GenericTimer(id, selected)},
TMR/REF window
Sébastien MARQUE authored on 2017-03-28
505
                            {type: 'separator'},
fix non-set values
Sébastien MARQUE authored on 2020-04-27
506
                            {text: sprintf('Vx     %3iKT',
507
                                            alerts.getNode('Vx') != nil ? alerts.getValue('Vx') : 0), type: 'normal', scrollgroup:0},
TMR/REF available
Sébastien MARQUE authored on 2017-04-10
508
                            {text: me.device.data['Vx-visible'] ? '   ON >' : '< OFF  ', type: 'editable|immediate|end-of-line', choices: ['   ON >', '< OFF  '], scrollgroup:0, callback: func (id, selected) Vspeed_visiblity(id, selected, 'Vx')},
fix non-set values
Sébastien MARQUE authored on 2020-04-27
509
                            {text: sprintf('Vy     %3iKT',
510
                                            alerts.getNode('Vy') != nil ? alerts.getValue('Vy') : 0), type: 'normal', scrollgroup:1},
TMR/REF available
Sébastien MARQUE authored on 2017-04-10
511
                            {text: me.device.data['Vy-visible'] ? '   ON >' : '< OFF  ', type: 'editable|immediate|end-of-line', choices: ['   ON >', '< OFF  '], scrollgroup:1, callback: func (id, selected) Vspeed_visiblity(id, selected, 'Vy')},
fix non-set values
Sébastien MARQUE authored on 2020-04-27
512
                            {text: sprintf('Vr     %3iKT',
513
                                            alerts.getNode('Vr') != nil ? alerts.getValue('Vr') : 0), type: 'normal', scrollgroup:2},
TMR/REF available
Sébastien MARQUE authored on 2017-04-10
514
                            {text: me.device.data['Vr-visible'] ? '   ON >' : '< OFF  ', type: 'editable|immediate|end-of-line', choices: ['   ON >', '< OFF  '], scrollgroup:2, callback: func (id, selected) Vspeed_visiblity(id, selected, 'Vr')},
fix non-set values
Sébastien MARQUE authored on 2020-04-27
515
                            {text: sprintf('Vglide %3iKT',
516
                                            alerts.getNode('Vglide') != nil ? alerts.getValue('Vglide') : 0), type: 'normal', scrollgroup:3},
TMR/REF available
Sébastien MARQUE authored on 2017-04-10
517
                            {text: me.device.data['Vglide-visible'] ? '   ON >' : '< OFF  ', type: 'editable|immediate|end-of-line', choices: ['   ON >', '< OFF  '], scrollgroup:3, callback: func (id, selected) Vspeed_visiblity(id, selected, 'Vglide')},
TMR/REF window
Sébastien MARQUE authored on 2017-03-28
518
                            {type: 'separator'},
519
                            {text: 'MINIMUMS', type: 'normal'},
TMR/REF available
Sébastien MARQUE authored on 2017-04-10
520
                            {text: '   OFF   >', type: 'editable', choices: ['   OFF   >', '<  BARO  >','<TEMP COMP'], callback: func},
TMR/REF window adaptation
Sébastien MARQUE authored on 2017-04-02
521
                            {text: ' 1000FT', type: 'editable', format: '% 5iFT', factor: 100, callback: func},
522
                        ],
523
                        { # scrolling info, see menu.nas
524
                            lines : 3,
525
                            columns : 2,
526
                        }
TMR/REF window
Sébastien MARQUE authored on 2017-03-28
527
                    );
528
                    me.device.knobs.FmsInner = me.device.knobs.MenuSettings;
529
                    me.device.knobs.FmsOuter = me.device.knobs.NavigateMenu;
TMR/REF available
Sébastien MARQUE authored on 2017-04-10
530
                    me.device.buttons.ENT = me.device.buttons.ValidateTMRREF;
531
                    me.device.buttons.FMS = me.device.buttons.ValidateTMRREF;
532
                    me.device.buttons.CLR = me.device.buttons.ClearTMRREF;
TMR/REF window
Sébastien MARQUE authored on 2017-03-28
533
                }
534
                else {
TMR/REF available
Sébastien MARQUE authored on 2017-04-10
535
                    me.device.buttons.ClearTMRREF();
TMR/REF window
Sébastien MARQUE authored on 2017-03-28
536
                }
537
            },
softkeys are available now
Sébastien MARQUE authored on 2017-03-14
538
        },
539
        MFD : {
540
            ENGINE: {
541
                FUEL: {
542
                    UNDO: func {
543
                        pop(me.path);
544
                        me.device.display.updateSoftKeys();
545
                    },
546
                    ENTER: func {
547
                        pop(me.path);
548
                        me.device.display.updateSoftKeys();
549
                    },
550
                },
551
                ENGINE: func {
552
                    me.path = [];
553
                    me.device.display.updateSoftKeys();
554
                },
555
            },
add missing exit to MFD/CHKL...
Sébastien MARQUE authored on 2017-03-20
556
            CHKLIST : {
add checklists management
Sébastien MARQUE authored on 2020-04-30
557
                _showCheckList: func (id, selected) {
558
                    var tabulate = func (l, r, t = 3, c = '.') {
559
                        var s = '';
560
                        for (var i = 0; i < (l - r) + t; i += 1) s ~= c;
561
                        return s;
562
                    }
563

            
564
                    var groupIndex     = me.device.windows.state[id].objects[selected].groupIndex;
565
                    var checklistIndex = me.device.windows.state[id].objects[selected].checklistIndex;
566

            
567
                    if (contains(me.device.windows.state[id].objects[selected], 'pageIndex'))
568
                        pageIndex = me.device.windows.state[id].objects[selected].pageIndex;
569
                    else
570
                        pageIndex = -1;
571

            
572
                    var title = '';
573
                    if (contains(me.device.windows.state[id].objects[selected], 'checklistTitle'))
574
                        title = me.device.windows.state[id].objects[selected].checklistTitle;
575
                    else
576
                        title = me.device.windows.state[id].objects[selected].text;
577

            
578
                    me.device.windows.del(id);
579

            
580
                    if (groupIndex < 0)
581
                         checklistNode = props.globals.getNode("/sim/checklists")
582
                                    .getChild('checklist', checklistIndex);
583
                    else
584
                         checklistNode = props.globals.getNode("/sim/checklists")
585
                                    .getChild("group", groupIndex)
586
                                    .getChild('checklist', checklistIndex);
587

            
588
                    var pages = checklistNode.getChildren('page');
589

            
590
                    if (size(pages) and pageIndex == -1)
591
                        pageIndex = 0;
592

            
593
                    _previous_text = ' < PREVIOUS ';
594
                    _next_text     = ' NEXT > ';
595

            
596
                    var obj_infos = [];
597
                    var length = size(_previous_text ~ _next_text);
598
                    var length_cache = [];
599
                    if (size(pages))
600
                        checklistNode = pages[pageIndex];
601

            
602
                    append(obj_infos, {
603
                        text: sprintf('%s%s',
604
                                      title,
605
                                      size(pages) > 1 ? sprintf(' %d / %d',
606
                                                                pageIndex + 1,
607
                                                                size(pages)) : ''),
608
                        type: 'title'
609
                    });
610

            
611
                    append(obj_infos, {type: 'separator'});
612

            
613
                    forindex (var i; checklistNode.getChildren('item')) {
614
                        var l = size(checklistNode.getChild('item', i).getValue('name'));
615
                        if (checklistNode.getChild('item', i).getChild('value') != nil)
616
                            l += size(checklistNode.getChild('item', i).getValue('value'));
617
                        append(length_cache, l);
618
                        if (l > length)
619
                            length = l;
620
                    }
621

            
622
                    forindex (var i; checklistNode.getChildren('item')) {
623
                        var text = pages[pageIndex].getChild('item', i).getValue('name');
624
                        var item_val = '';
625
                        if (pages[pageIndex].getChild('item', i).getChild('value') != nil)
626
                            item_val = pages[pageIndex].getChild('item', i).getValue('value');
627
                        if (item_val != '')
628
                            text ~= tabulate(length, length_cache[i]);
629
                        text ~= item_val;
630

            
631
                        append(obj_infos, {
632
                            text: text,
633
                            groupIndex: groupIndex,
634
                            checklistIndex: checklistIndex,
635
                            pageIndex: pageIndex,
636
                            type: 'normal|end-of-line'
637
                        });
638
                    }
639

            
640
                    append(obj_infos, {type: 'separator'});
641

            
642
                    if (pageIndex and size(pages))
643
                        append(obj_infos, {
644
                                text: _previous_text,
645
                                groupIndex: groupIndex,
646
                                checklistIndex: checklistIndex,
647
                                pageIndex: pageIndex - 1,
648
                                checklistTitle: title,
649
                                type: (pageIndex + 1 < size(pages)) ? 'editable' : 'selected',
650
                                callback: func (id, selected) call(me.device.softkeys.bindings.MFD.CHKLIST._showCheckList, [id, selected], me)
651
                        });
652
                    else
653
                        append(obj_infos, {
654
                            text: tabulate(length, size(_next_text), 0, ' '),
655
                            type: 'normal'
656
                        });
657

            
658
                    if (pageIndex + 1 < size(pages)) {
659
                        if (pageIndex and size(pages))
660
                            append(obj_infos, {
661
                                text: tabulate(length, size(_previous_text ~ _next_text), 0, ' '),
662
                                type: 'normal',
663
                            });
664
                        append(obj_infos, {
665
                                text: _next_text,
666
                                groupIndex: groupIndex,
667
                                checklistIndex: checklistIndex,
668
                                pageIndex: pageIndex + 1,
669
                                checklistTitle: title,
670
                                type: 'selected|end-of-line',
671
                                callback: func (id, selected) call(me.device.softkeys.bindings.MFD.CHKLIST._showCheckList, [id, selected], me)
672
                        });
673
                    }
674

            
675
                    me.device.knobs.FmsInner = me.device.knobs.NavigateMenu;
676
                    me.device.knobs.FmsOuter = me.device.knobs.NavigateMenu;
677
                    me.device.buttons.ENT    = me.device.buttons.ValidateTMRREF;
678
                    me.device.buttons.CLR = func {
679
                        me.device.windows.del(id);
680
                        me.device.knobs.FmsOuter = func;
681
                        me.device.knobs.FmsInner = func;
682
                        foreach (var b; ['ENT', 'CLR'])
683
                            me.device.buttons[b] = func;
684
                        me.device.buttons.MENU = func;
685
                    }
686
                    me.device.windows.draw( id, {autogeom: 1}, obj_infos );
687
                },
688
                LIST: func {
689
                    # nested function as checklist lists may be organized by group
690
                    var listChecklists = func (id, selected) {
691
                        var groupIndex = me.device.windows.state[id].objects[selected].groupIndex;
692

            
693
                        me.device.windows.del(id);
694

            
695
                        var checklists = [];
696
                        var firstEntry = 1;
697
                        if (groupIndex == -1)
698
                            checklists = props.globals.getNode("/sim/checklists")
699
                                            .getChildren('checklist');
700
                        else
701
                            checklists = props.globals.getNode("/sim/checklists")
702
                                            .getChild("group", groupIndex)
703
                                            .getChildren('checklist');
704
                        var checklistsQty = size(checklists);
705
                        var obj_infos = [];
706

            
707
                        if (checklistsQty) {
708
                            forindex (var c; checklists) {
709
                                if (string.uc(checklists[c].getValue('title')) == 'EMERGENCY') {
710
                                    checklistsQty -= 1;
711
                                    continue;
712
                                }
713
                                var title = checklists[c].getValue('title');
714
                                append(obj_infos, {
715
                                    text: title,
716
                                    groupIndex: groupIndex,
717
                                    checklistIndex: c,
718
                                    checklistTitle: title,
719
                                    type: (firstEntry ? 'selected' : 'editable') ~ '|end-of-line',
720
                                    callback: func (id, selected) call(me.device.softkeys.bindings.MFD.CHKLIST._showCheckList, [id, selected], me)
721
                                });
722
                                if (checklistsQty == 1) { # see comments below for groups
723
                                    call(me.device.softkeys.bindings.MFD.CHKLIST._showCheckList, [groupIndex, 0], me);
724
                                    return;
725
                                }
726
                                elsif (checklistsQty == 0)
727
                                    return;
728
                                firstEntry = 0;
729
                            }
730
                        }
731

            
732
                        id ~= ' CHECKLISTS';
733
                        me.device.knobs.FmsInner = me.device.knobs.NavigateMenu;
734
                        me.device.knobs.FmsOuter = me.device.knobs.NavigateMenu;
735
                        me.device.buttons.ENT    = me.device.buttons.ValidateTMRREF;
736
                        me.device.buttons.CLR = func {
737
                            me.device.windows.del(id);
738
                            me.device.knobs.FmsOuter = func;
739
                            me.device.knobs.FmsInner = func;
740
                            foreach (var b; ['ENT', 'CLR'])
741
                                me.device.buttons[b] = func;
742
                            me.device.buttons.MENU = func;
743
                        }
744
                        me.device.windows.draw(id, {autogeom: 1}, obj_infos);
745
                    }
746

            
747
                    var windowId = 'CHKLIST LIST';
748
                    if (contains(me.device.windows.state, windowId))
749
                        me.device.windows.del(windowId);
750

            
751
                    var obj_infos = [];
752
                    var firstEntry = 1;
753
                    var groups = props.globals.getNode("/sim/checklists").getChildren("group");
754
                    var groupsQty = size(groups);
755

            
756
                    if (groupsQty) {
757
                        forindex (var g; groups) {
758
                            # emergency checklists are listed in their own menu
759
                            if (string.uc(groups[g].getValue('name')) == 'EMERGENCY') {
760
                                groupsQty -= 1;
761
                                continue;
762
                            }
763
                            # the key groupIndex isn't used by the display system
764
                            # we use it to keep the information of group node's index
765
                            append(obj_infos, {
766
                                text: groups[g].getValue('name'),
767
                                groupIndex: g,
768
                                type: (firstEntry ? 'selected' : 'editable') ~ '|end-of-line',
769
                                callback: func (id, selected) listChecklists(id, selected) });
770
                            firstEntry = 0;
771
                            # if there are only one group left, let display it directly
772
                            if (groupsQty == 1) {
773
                                listChecklists(windowId, 0);
774
                                return;
775
                            }
776
                            elsif (groupsQty == 0) {
777
                                return;
778
                            }
779
                        }
780
                    }
781
                    else {
782
                        listChecklists(windowId, -1);
783
                        return;
784
                    }
785

            
786
                    me.device.knobs.FmsInner = me.device.knobs.NavigateMenu;
787
                    me.device.knobs.FmsOuter = me.device.knobs.NavigateMenu;
788
                    me.device.buttons.ENT    = me.device.buttons.ValidateTMRREF;
789
                    me.device.buttons.CLR = func {
790
                        me.device.windows.del(windowId);
791
                        me.device.knobs.FmsOuter = func;
792
                        me.device.knobs.FmsInner = func;
793
                        foreach (var b; ['ENT', 'CLR'])
794
                            me.device.buttons[b] = func;
795
                        me.device.buttons.MENU = func;
796
                    }
797
                    me.device.windows.draw(windowId, {autogeom: 1}, obj_infos);
798
                },
799
                EMERGCY: func {
800
                    # nested function as checklist lists may be organized by group
801
                    var listChecklists = func (groupIndex) {
802
                        var checklists = [];
803
                        var firstEntry = 1;
804
                        if (groupIndex == -1)
805
                            checklists = props.globals.getNode("/sim/checklists")
806
                                            .getChildren('checklist');
807
                        else
808
                            checklists = props.globals.getNode("/sim/checklists")
809
                                            .getChild("group", groupIndex)
810
                                            .getChildren('checklist');
811
                        var checklistsQty = size(checklists);
812
                        var obj_infos = [];
813
                        var firstEntry = 1;
814

            
815
                        if (checklistsQty) {
816
                            forindex (var c; checklists) {
817
                                if (groupIndex < 0 and string.uc(checklists[c].getValue('title')) != 'EMERGENCY') {
818
                                    checklistsQty -= 1;
819
                                    continue;
820
                                }
821
                                append(obj_infos, {
822
                                    text: checklists[c].getValue('title'),
823
                                    groupIndex: groupIndex,
824
                                    checklistIndex: c,
825
                                    type: (firstEntry ? 'selected' : 'editable') ~ '|end-of-line',
826
                                    callback: func (id, selected) call(me.device.softkeys.bindings.MFD.CHKLIST._showCheckList, [id, selected], me)
827
                                });
828
                                firstEntry = 0;
829
                            }
830
                        }
831
                        id = 'EMERGENCY CHECKLISTS';
832
                        me.device.knobs.FmsInner = me.device.knobs.NavigateMenu;
833
                        me.device.knobs.FmsOuter = me.device.knobs.NavigateMenu;
834
                        me.device.buttons.ENT    = me.device.buttons.ValidateTMRREF;
835
                        me.device.buttons.CLR = func {
836
                            me.device.windows.del(id);
837
                            me.device.knobs.FmsOuter = func;
838
                            me.device.knobs.FmsInner = func;
839
                            foreach (var b; ['ENT', 'CLR'])
840
                                me.device.buttons[b] = func;
841
                            me.device.buttons.MENU = func;
842
                        }
843
                        me.device.windows.draw(id, {autogeom: 1}, obj_infos);
844
                        if (checklistsQty == 1) { # see comments below for groups
845
                            call(me.device.softkeys.bindings.MFD.CHKLIST._showCheckList, [groupIndex, 0], me);
846
                            return;
847
                        }
848
                        elsif (checklistsQty == 0)
849
                            call(me.device.buttons.CLR, [0], me);
850
                            return;
851
                    }
852

            
853
                    var windowId = 'CHKLIST EMERGCY';
854
                    if (contains(me.device.windows.state, windowId))
855
                        me.device.windows.del(windowId);
856

            
857
                    var groups = props.globals.getNode("/sim/checklists").getChildren("group");
858

            
859
                    var emergency_group_found = 0;
860
                    if (size(groups)) {
861
                        forindex (var g; groups) {
862
                            # emergency checklists are listed in their own menu
863
                            # we support only one emergency checklists group named EMERGENCY (case insensitive)
864
                            if (string.uc(groups[g].getValue('name')) != 'EMERGENCY')
865
                                continue;
866
                            listChecklists(g);
867
                            emergency_group_found = !emergency_group_found;
868
                            break;
869
                        }
870
                    }
871

            
872
                    if (!emergency_group_found)
873
                        listChecklists(-1);
874
                },
add missing exit to MFD/CHKL...
Sébastien MARQUE authored on 2017-03-20
875
                EXIT: func {
876
                    me.path = [];
877
                    me.device.display.updateSoftKeys();
878
                },
879
            },
add TCAS
Sébastien MARQUE authored on 2017-12-21
880
            MAP: {
881
                TRAFFIC: func {
improve the selection of dis...
Sébastien MARQUE authored on 2017-12-30
882
                    call(me.bindings.PFD.INSET.declutter, ['MAPTRAFFIC', 'tcas', 0], me);
883
                },
884
                ROUTE: func {
885
                    call(me.bindings.PFD.INSET.declutter, ['MAPROUTE', 'route', 1], me);
886
                },
887
                TERRAIN: func {
888
                    call(me.bindings.PFD.INSET.declutter, ['MAPTERRAIN', 'tiles', 3], me);
889
                },
890
                NAVAIDS: {
891
                    ALL: func {
892
                        call(me.bindings.PFD.INSET.NAVAIDS.ALL, [ 'MAPNAVAIDS' ], me);
893
                    },
894
                    VOR: func {
895
                        call(me.bindings.PFD.INSET.NAVAIDS.declutter, ['MAPNAVAIDSVOR', 'VOR', 2], me);
896
                    },
897
                    TACAN: func {
898
                        call(me.bindings.PFD.INSET.NAVAIDS.declutter, ['MAPNAVAIDSTACAN', 'TACAN', 3], me);
899
                    },
900
                    NDB: func {
901
                        call(me.bindings.PFD.INSET.NAVAIDS.declutter, ['MAPNAVAIDSNDB', 'NDB', 4], me);
902
                    },
903
                    DME: func {
904
                        call(me.bindings.PFD.INSET.NAVAIDS.declutter, ['MAPNAVAIDSDME', 'DME', 5], me);
905
                    },
906
                    APT: func {
907
                        call(me.bindings.PFD.INSET.NAVAIDS.declutter, ['MAPNAVAIDSAPT', 'airport', 6], me);
908
                    },
add TCAS
Sébastien MARQUE authored on 2017-12-21
909
                },
910
            },
softkeys are available now
Sébastien MARQUE authored on 2017-03-14
911
        },
commit initial
Sébastien MARQUE authored on 2017-03-07
912
    },
913
};
massive code reorganisation ...
Sébastien MARQUE authored on 2017-05-01
914

            
915
var keyMap = {
vim folds
Sébastien MARQUE authored on 2017-12-21
916
# softkeys map for PFD and MFD {{{1
917
# PFD {{{2
massive code reorganisation ...
Sébastien MARQUE authored on 2017-05-01
918
    PFD : {
919
        first : 1,
920
        texts : ['INSET', 'SENSOR', 'PFD', 'OBS', 'CDI', 'DME', 'XPDR', 'IDENT', 'TMR/REF', 'NRST' ],
921
        INSET : {
improve the selection of dis...
Sébastien MARQUE authored on 2017-12-30
922
            texts : ['OFF', '', 'TRAFFIC', 'ROUTE', 'TOPO', 'TERRAIN', 'NAVAIDS', 'METAR'],
923
            NAVAIDS : {
924
                first : 2,
925
                texts : ['VOR', 'TACAN', 'NDB', 'DME', 'APT', '', 'ALL'],
926
            },
massive code reorganisation ...
Sébastien MARQUE authored on 2017-05-01
927
        },
928
        SENSOR : {
929
            first : 2,
930
            texts : [ 'ADC1', 'ADC2', '', 'AHRS1', 'AHRS2'],
931
        },
932
        PFD : {
933
            texts : [ 'SYN VIS', 'DFLTS', 'AOA/WIND', 'DME', 'BRG1', 'HSI FMT', 'BRG2', '', 'ALT UNIT', 'STD BARO' ],
934
            'SYN VIS' : {
935
                texts : [ 'PATHWAY', 'SYN TERR', 'HR2NHDG', 'APTSIGNS', 'FPM'],
936
            },
937
            'AOA/WIND' : {
938
                first : 4,
939
                texts : ['AOA', 'WIND'],
940
                AOA : {
941
                    first : 5,
942
                    texts : ['AOA ON', 'AOA AUTO'],
943
                },
944
                WIND : {
945
                    first : 2,
946
                    texts : ['OPTN1', 'OPTN2', '', 'OFF'],
947
                },
948
            },
949
            'HSI FMT' : {
950
                first : 6,
951
                texts : ['360 HSI', 'ARC HSI'],
952
            },
953
            'ALT UNIT' : {
954
                first : 5,
955
                texts : ['METERS', '', 'IN', 'HPA'],
956
            },
957
        },
958
        XPDR : {
959
            first : 2,
960
            texts : ['STBY', 'ON', 'ALT', '', 'VFR', 'CODE', 'IDENT'],
961
            CODE : {
962
                texts : ['0', '1', '2', '3', '4', '5', '6', '7', 'IDENT', 'BKSP'],
963
            },
964
        },
965
    },
vim folds
Sébastien MARQUE authored on 2017-12-21
966
#}}}2
967
# MFD {{{2
massive code reorganisation ...
Sébastien MARQUE authored on 2017-05-01
968
    MFD : {
969
        texts : ['ENGINE', '', 'MAP', '', '', '', '', '', '', 'DCLTR', 'SHW CHRT', 'CHKLIST'],
970
        MAP : {
improve the selection of dis...
Sébastien MARQUE authored on 2017-12-30
971
            texts : ['TRAFFIC', 'ROUTE', 'TOPO', 'TERRAIN', 'NAVAIDS', '','', '', '', '', 'BACK'],
972
            NAVAIDS : {
973
                first : 2,
974
                texts : ['VOR', 'TACAN', 'NDB', 'DME', 'APT', '', 'ALL', '', '', 'BACK' ],
975
            },
massive code reorganisation ...
Sébastien MARQUE authored on 2017-05-01
976
        },
977
        CHKLIST : {
add checklists management
Sébastien MARQUE authored on 2020-04-30
978
            texts : ['ENGINE', '', '', '', 'LIST', 'DONE', '', '', '', '', 'EXIT', 'EMERGCY'],
massive code reorganisation ...
Sébastien MARQUE authored on 2017-05-01
979
        },
980
        ENGINE : {
981
            texts : ['ENGINE', 'ANTI-ICE', '', 'DCLTR', '', 'ASSIST', '', '', '', '', 'FUEL'],
982
            'ANTI-ICE' : {
983
                texts : ['LEFT', 'AUTO', 'RIGHT', '', '', '', '', '', '', '', '', 'BACK'],
984
            },
985
            FUEL : {
986
                first : 1,
987
                texts : ['FULL', 'TABS', '', '', '', '', '', '', '', 'UNDO', 'ENTER'],
988
            },
989
        },
990
    },
vim folds
Sébastien MARQUE authored on 2017-12-21
991
#}}}2
massive code reorganisation ...
Sébastien MARQUE authored on 2017-05-01
992
};
993
if (data['stall-aoa'] == 9999)
994
    keyMap.PFD.PFD['AOA/WIND'].texts = ['', 'WIND'];
add checklists management
Sébastien MARQUE authored on 2020-04-30
995
if (props.globals.getNode('/sim/checklists') == nil) {
996
    keyMap.MFD.texts[11] = '';
997
    delete(keyMap.MFD, 'CHKLIST');
998
}
vim folds
Sébastien MARQUE authored on 2017-12-21
999
#}}}1