Showing 5 changed files with 478 additions and 61 deletions
+11 -1
Nasal/core.nas
... ...
@@ -74,6 +74,16 @@ var setListeners = func {
74 74
                     device[1].display.updateCRS(val);
75 75
                 }
76 76
             }, 0, 2);
77
+    setlistener('/instrumentation/zkv1000/afcs/selected-alt-ft',
78
+            func (n) {
79
+            print('/instrumentation/zkv1000/afcs/selected-alt-ft');
80
+                var val = n.getValue();
81
+                if (val != nil) {
82
+                    device[0].display.screenElements['SelectedAlt-bug'].show();
83
+                    device[0].display.screenElements['SelectedAlt-top'].show();
84
+                    device[0].display.updateSelectedALT();
85
+                }
86
+            }, 0, 2);
77 87
 }
78 88
 
79 89
 var deviceClass = {
... ...
@@ -86,7 +96,7 @@ var deviceClass = {
86 96
         m.buttons  = buttonsClass.new(m.node);
87 97
         m.knobs    = knobsClass.new(m.node);
88 98
         m.softkeys = softkeysClass.new(m, m.node, m.role);
89
-        m.softkeys.clean();
99
+#m.softkeys.clean();
90 100
         m.display.loadsvg();
91 101
         m.display.loadGroup({
92 102
             hide : [
+150 -19
Nasal/display.nas
... ...
@@ -96,6 +96,10 @@ var displayClass = {
96 96
                     'Trends',
97 97
                     'Airspeed-Trend-Indicator',
98 98
                     'Altitude-Trend-Indicator',
99
+                    'OAT',
100
+                    'IAS-bg',
101
+                    'TAS',
102
+                    'GSPD',
99 103
                 );
100 104
                 append(groups.hide,
101 105
                     'CDI',
... ...
@@ -110,10 +114,10 @@ var displayClass = {
110 114
                     'SelectedCRS-bg',
111 115
                     'SelectedCRS-bgtext',
112 116
                     'SelectedCRS-text',
113
-                    'SelectedALT',
117
+                    'SelectedAlt-bug',
118
+                    'SelectedAlt-top',
114 119
                     'TAS',
115 120
                     'GSPD',
116
-                    'OAT',
117 121
                     'BARO',
118 122
                     'WindData',
119 123
                     'Reversionnary',
... ...
@@ -123,7 +127,8 @@ var displayClass = {
123 127
                     'BRG2',
124 128
                     'DME1',
125 129
                     'PFD-Map',
126
-                    'PFD-Multilines'
130
+                    'PFD-Multilines',
131
+                    'WindData', 'WindData-OPTN1', 'WindData-OPTN2', 'WindData-OPTN1-HDG', 'WindData-OPTN2-symbol', 'WindData-OPTN2-headwind', 'WindData-OPTN2-crosswind'
127 132
                 );
128 133
                 append(groups.clip,
129 134
                     'SpeedLint1',
... ...
@@ -132,11 +137,17 @@ var displayClass = {
132 137
                     'AltLint00011'
133 138
                 );
134 139
                 append(groups.text,
140
+                    'SelectedAlt-text',
141
+                    'TAS-text',
142
+                    'GSPD-text',
135 143
                     'TIME-text',
144
+                    'OAT-text',
136 145
                     'VSIText',
137 146
                     'Speed110',
138 147
                     'Alt11100',
139 148
                     'HDG-text',
149
+                    'WindData-OPTN1-HDG-text', 'WindData-OPTN1-SPD-text',
150
+                    'WindData-OPTN2-crosswind-text', 'WindData-OPTN2-headwind-text',
140 151
                     'AltBigC', 'AltSmallC'
141 152
                 );
142 153
                 for (var place = 1; place <= 6; place +=1) {
... ...
@@ -154,12 +165,15 @@ var displayClass = {
154 165
             me.loadGroup(groups);
155 166
 
156 167
             if (me.role == 'PFD') {
157
-                me.updateAI(getprop('/orientation/roll-deg'),getprop('orientation/pitch-deg'));
158
-                me.updateVSI(getprop('/instrumentation/vertical-speed-indicator/indicated-speed-fpm'));
159
-                me.updateIAS(getprop('/velocities/airspeed-kt'));
160
-                me.updateALT(getprop('instrumentation/altimeter/indicated-altitude-ft'));
161
-                me.updateHSI(getprop('orientation/heading-deg'));
168
+                me.update();
169
+                me.updateAI();
170
+                me.updateVSI();
171
+                me.updateIAS();
172
+                me.updateALT();
173
+                me.updateHSI();
162 174
                 me.updateTIME();
175
+                me.updateOAT();
176
+                me.updateTAS();
163 177
                 me.timerTrigger();
164 178
             }
165 179
             me._updateRadio({auto:'nav'});
... ...
@@ -286,6 +300,12 @@ var displayClass = {
286 300
         'nav2-id' : {
287 301
             default: ''
288 302
         },
303
+        'TAS-text' : {
304
+            alignment : 'right-bottom',
305
+        },
306
+        'GSPD-text' : {
307
+            alignment : 'right-bottom',
308
+        },
289 309
     },
290 310
 #}}}
291 311
 
... ...
@@ -328,8 +348,28 @@ var displayClass = {
328 348
     },
329 349
 #}}}
330 350
 
331
-    updateAI: func(roll,pitch){
351
+    update : func {
352
+# updates roll, pitch, VSI, IAS, altitude and HDG {{{
353
+        me._updated_roll = getprop('/orientation/roll-deg');
354
+        me._updated_pitch = getprop('orientation/pitch-deg');
355
+        me._updated_vsi = getprop('/instrumentation/vertical-speed-indicator/indicated-speed-fpm');
356
+        me._updated_ias = getprop('/velocities/airspeed-kt');
357
+        me._updated_alt = getprop('/instrumentation/altimeter/indicated-altitude-ft');
358
+        me._updated_hdg = getprop('/orientation/heading-deg');
359
+        settimer(func me.update(), 0.05);
360
+     },
361
+    _updated_roll : 0,
362
+    _updated_pitch : 0,
363
+    _updated_vsi : 0,
364
+    _updated_ias : 0,
365
+    _updated_alt : 0,
366
+    _updated_hdg : 0,
367
+#}}}
368
+
369
+    updateAI: func(){
332 370
 #{{{
371
+        var pitch = me._updated_pitch;
372
+        var roll = me._updated_roll;
333 373
         if (pitch > 80)
334 374
             pitch = 80;
335 375
         elsif (pitch < -80)
... ...
@@ -339,12 +379,13 @@ var displayClass = {
339 379
             .setTranslation(0, pitch * 6.8571428);
340 380
         me.screenElements.bankPointer
341 381
             .setRotation(-roll * D2R);
342
-        settimer(func me.updateAI(getprop('/orientation/roll-deg'),getprop('orientation/pitch-deg')), 0.1);
382
+        settimer(func me.updateAI(), 0.1);
343 383
     },
344 384
 #}}}
345 385
 
346
-    updateVSI: func (vsi) {
386
+    updateVSI: func () {
347 387
 # animate VSI {{{
388
+        var vsi = me._updated_vsi;
348 389
         me.screenElements.VSIText
349 390
             .setText(num(math.round(vsi, 10)));
350 391
         if (vsi > 4500)
... ...
@@ -353,12 +394,13 @@ var displayClass = {
353 394
             vsi = -4500;
354 395
         me.screenElements.VSI
355 396
             .setTranslation(0, vsi * -0.03465);
356
-        settimer(func me.updateVSI(getprop('/instrumentation/vertical-speed-indicator/indicated-speed-fpm')), 0.1);
397
+        settimer(func me.updateVSI(), 0.1);
357 398
     },
358 399
 #}}}
359 400
 
360
-    updateIAS: func (ias) {
401
+    updateIAS: func () {
361 402
 # animates the IAS lint (PFD) {{{
403
+        var ias = me._updated_ias;
362 404
         if (ias >= 10)
363 405
             me.screenElements.Speed110
364 406
                 .setText(sprintf("% 2u",num(math.floor(ias/10))));
... ...
@@ -369,6 +411,16 @@ var displayClass = {
369 411
             .setTranslation(0,(math.mod(ias,10) + (ias >= 10)*10) * 36);
370 412
         me.screenElements.SpeedTape
371 413
             .setTranslation(0,ias * 5.711);
414
+        if (ias > me._ias_vne and ! me._ias_already_exceeded) { # easier than .getColorFill
415
+            me._ias_already_exceeded = 1;
416
+            me.screenElements['IAS-bg']
417
+                .setColorFill(1,0,0);
418
+        }
419
+        elsif (ias < me._ias_vne and me._ias_already_exceeded) { # easier than .getColorFill
420
+            me._ias_already_exceeded = 0;
421
+            me.screenElements['IAS-bg']
422
+                .setColorFill(0,0,0);
423
+        }
372 424
         var now = systime();
373 425
         # estimated speed in 6s
374 426
         var Sy = 6 * (ias - me._last_ias_kt) / (now - me._last_ias_s);
... ...
@@ -379,14 +431,27 @@ var displayClass = {
379 431
             .setTranslation(0, -284.5 * (Sy - 1));
380 432
         me._last_ias_kt = ias;
381 433
         me._last_ias_s = now;
382
-        settimer(func me.updateIAS(getprop('/velocities/airspeed-kt')), 0.1);
434
+        settimer(func me.updateIAS(), 0.1);
383 435
     },
384 436
     _last_ias_kt : 0,
385 437
     _last_ias_s : systime(),
438
+    _ias_vne : 999,
439
+    _ias_already_exceeded : 0,
386 440
 #}}}
387 441
 
388
-    updateALT: func (alt) {
389
-# animates the altitude lint (PFD) trent to do {{{
442
+    updateTAS: func {
443
+# updates the True Airspeed and GroundSpeed indicators {{{
444
+        me.screenElements['TAS-text']
445
+            .setText(sprintf('%iKT', getprop('/instrumentation/airspeed-indicator/true-speed-kt')));
446
+        me.screenElements['GSPD-text']
447
+            .setText(sprintf('%iKT', getprop('/velocities/groundspeed-kt')));
448
+        settimer(func me.updateTAS(), 0.5);
449
+    },
450
+#}}}
451
+
452
+    updateALT: func () {
453
+# animates the altitude lint (PFD) {{{
454
+        var alt = me._updated_alt;
390 455
         if (alt < 0)
391 456
             me.screenElements.Alt11100
392 457
                 .setText(sprintf("% 3i",math.ceil(alt/100)));
... ...
@@ -523,6 +588,7 @@ var displayClass = {
523 588
                 me.screenElements["AltSmallD"~place].setTranslation(offset,0);
524 589
             }
525 590
         }
591
+        me.updateSelectedALT();
526 592
         var now = systime();
527 593
         # altitude in 6s
528 594
         var Sy = .3 * (alt - me._last_alt_ft) / (now - me._last_alt_s); # scale = 1/20ft
... ...
@@ -533,19 +599,20 @@ var displayClass = {
533 599
             .setTranslation(0, -284.5 * (Sy - 1));
534 600
         me._last_alt_ft = alt;
535 601
         me._last_alt_s = now;
536
-        settimer(func me.updateALT(getprop('instrumentation/altimeter/indicated-altitude-ft')), 0.2);
602
+        settimer(func me.updateALT(), 0.2);
537 603
     },
538 604
     _last_alt_ft : 0,
539 605
     _last_alt_s  : systime(),
540 606
 #}}}
541 607
 
542
-    updateHSI : func (hdg) {
608
+    updateHSI : func () {
543 609
 # rotates the compass (PFD) {{{
610
+        var hdg = me._updated_hdg;
544 611
         me.screenElements.Rose
545 612
             .setRotation(-hdg * D2R);
546 613
         me.screenElements['HDG-text']
547 614
             .setText(sprintf("%03u°", hdg));
548
-        settimer(func me.updateHSI(getprop('orientation/heading-deg')), 0.1);
615
+        settimer(func me.updateHSI(), 0.1);
549 616
     },
550 617
 #}}}
551 618
 
... ...
@@ -581,6 +648,21 @@ var displayClass = {
581 648
     },
582 649
 #}}}
583 650
 
651
+    updateSelectedALT : func {
652
+# animation for altitude section, called via updatedALT {{{
653
+        var selected_alt = getprop('/instrumentation/zkv1000/afcs/selected-alt-ft');
654
+        var delta_alt = me._updated_alt - selected_alt;
655
+        if (abs(delta_alt) > 300)
656
+            delta_alt = 300 * abs(delta_alt)/delta_alt;
657
+        me.screenElements['SelectedAlt-top']
658
+            .setVisible(abs(delta_alt) > 100);
659
+        me.screenElements['SelectedAlt-bug']
660
+            .setTranslation(0, delta_alt * 0.567); # 170/300 = 0.567
661
+        me.screenElements['SelectedAlt-text']
662
+            .setText(sprintf("%i", selected_alt));
663
+    },
664
+#}}}
665
+
584 666
     _updateRadio: func {
585 667
 # common parts for NAV/LOC/COMM radios{{{
586 668
         # arg[0]._r = <comm|nav>
... ...
@@ -698,6 +780,55 @@ var displayClass = {
698 780
         settimer(func me.updateTIME(), 1);
699 781
     },
700 782
 #}}}
783
+
784
+    updateOAT : func {
785
+# update OAT display on normal and reversionnary modes (every 3s) {{{
786
+        var tmp = getprop('/environment/temperature-deg' ~ me._oat_unit);
787
+        me.screenElements['OAT-text']
788
+            .setText(sprintf((abs(tmp) < 10) ? "%.1f %s" : "%i %s", tmp, (me._oat_unit == 'c') ? '°C' : 'F'));
789
+        settimer(func me.updateOAT(), 3);
790
+    },
791
+    _oat_unit : 'c',
792
+#}}}
793
+
794
+    updateWindData : func {
795
+# update the window text and arrows for OPTN1/2 {{{
796
+        if (me._winddata_optn == 0)
797
+            return;
798
+        var wind_hdg = getprop('/environment/wind-from-heading-deg');
799
+        var wind_spd = getprop('/environment/wind-speed-kt');
800
+        var alpha = wind_hdg - me._updated_hdg;
801
+        if (me._winddata_optn == 1) {
802
+            me.screenElements['WindData-OPTN1-HDG']
803
+                .setRotation((alpha + 180) * D2R);
804
+            me.screenElements['WindData-OPTN1-HDG-text']
805
+                .setText(sprintf("%03i°", wind_hdg));
806
+            me.screenElements['WindData-OPTN1-SPD-text']
807
+                .setText(int(wind_spd) ~ 'KT');
808
+        }
809
+        else { # me._winddata_optn == 2
810
+            alpha *= D2R;
811
+            var Vt = wind_spd * math.sin(alpha);
812
+            var Ve = wind_spd * math.cos(alpha);
813
+            if (Vt != 0) {
814
+                me.screenElements['WindData-OPTN2-crosswind-text']
815
+                    .setText(sprintf('%i', abs(Vt)));
816
+                me.screenElements['WindData-OPTN2-crosswind']
817
+                    .setScale(-abs(Vt)/Vt, 1)
818
+                    .setTranslation(-35 * (abs(Vt)/Vt + 1), 0);
819
+            }
820
+            if (Ve != 0) {
821
+                me.screenElements['WindData-OPTN2-headwind-text']
822
+                    .setText(sprintf('%i', abs(Ve)));
823
+                me.screenElements['WindData-OPTN2-headwind']
824
+                    .setScale(1, abs(Ve)/Ve)
825
+                    .setTranslation(0, 515 * (1 - abs(Ve)/Ve));
826
+            }
827
+        }
828
+        settimer(func me.updateWindData(), 0.5);
829
+    },
830
+    _winddata_optn : 0,
831
+#}}}
701 832
 };
702 833
 
703 834
 var keyMap = {
+28
Nasal/softkeys.nas
... ...
@@ -68,6 +68,34 @@ var softkeysClass = {
68 68
                     pop(me.path);
69 69
                     me.device.display.updateSoftKeys();
70 70
                 },
71
+                'AOA/WIND' : {
72
+                    WIND : {
73
+                        OPTN1 : func {
74
+                            me.device.display._winddata_optn = 1;
75
+                            me.device.display.screenElements['WindData'].show();
76
+                            me.device.display.screenElements['WindData-OPTN1'].show();
77
+                            me.device.display.screenElements['WindData-OPTN1-HDG'].show();
78
+                            me.device.display.screenElements['WindData-OPTN2'].hide();
79
+                            me.device.display.updateWindData();
80
+                        },
81
+                        OPTN2 : func {
82
+                            me.device.display._winddata_optn = 2;
83
+                            me.device.display.screenElements['WindData'].show();
84
+                            me.device.display.screenElements['WindData-OPTN1'].hide();
85
+                            me.device.display.screenElements['WindData-OPTN2'].show();
86
+                            me.device.display.screenElements['WindData-OPTN2-symbol'].show();
87
+                            me.device.display.screenElements['WindData-OPTN2-headwind'].show();
88
+                            me.device.display.screenElements['WindData-OPTN2-crosswind'].show();
89
+                            me.device.display.updateWindData();
90
+                        },
91
+                        OFF : func {
92
+                            me.device.display._winddata_optn = 0;
93
+                            me.device.display.screenElements['WindData'].hide();
94
+                            me.device.display.screenElements['WindData-OPTN1'].hide();
95
+                            me.device.display.screenElements['WindData-OPTN2'].hide();
96
+                        },
97
+                    },
98
+                },
71 99
             },
72 100
             XPDR: {
73 101
                 CODE: {
+288 -40
Systems/screen.svg
... ...
@@ -24,9 +24,9 @@
24 24
      borderopacity="1"
25 25
      inkscape:pageopacity="1"
26 26
      inkscape:pageshadow="2"
27
-     inkscape:zoom="1.4142136"
28
-     inkscape:cx="676.80694"
29
-     inkscape:cy="463.2631"
27
+     inkscape:zoom="16.970563"
28
+     inkscape:cx="686.00302"
29
+     inkscape:cy="482.06043"
30 30
      inkscape:document-units="px"
31 31
      inkscape:current-layer="Trends"
32 32
      showgrid="false"
... ...
@@ -40,10 +40,122 @@
40 40
      inkscape:snap-grids="true"
41 41
      inkscape:snap-to-guides="true"
42 42
      inkscape:object-paths="true"
43
-     inkscape:measure-start="461.034,2788.5"
44
-     inkscape:measure-end="459.63,483.503" />
43
+     inkscape:measure-start="704,654"
44
+     inkscape:measure-end="704,313" />
45 45
   <defs
46 46
      id="defs3142">
47
+    <marker
48
+       inkscape:stockid="TriangleOutM"
49
+       orient="auto"
50
+       refY="0.0"
51
+       refX="0.0"
52
+       id="TriangleOutM"
53
+       style="overflow:visible"
54
+       inkscape:isstock="true">
55
+      <path
56
+         id="path5943"
57
+         d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
58
+         style="fill-rule:evenodd;stroke:#fffffb;stroke-width:1pt;stroke-opacity:1;fill:#ffffff;fill-opacity:1"
59
+         transform="scale(0.4)" />
60
+    </marker>
61
+    <marker
62
+       inkscape:stockid="TriangleOutL"
63
+       orient="auto"
64
+       refY="0.0"
65
+       refX="0.0"
66
+       id="TriangleOutL"
67
+       style="overflow:visible"
68
+       inkscape:isstock="true">
69
+      <path
70
+         id="path5940"
71
+         d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
72
+         style="fill-rule:evenodd;stroke:#fffffb;stroke-width:1pt;stroke-opacity:1;fill:#ffffff;fill-opacity:1"
73
+         transform="scale(0.8)" />
74
+    </marker>
75
+    <marker
76
+       inkscape:stockid="Arrow2Lend"
77
+       orient="auto"
78
+       refY="0.0"
79
+       refX="0.0"
80
+       id="marker8408"
81
+       style="overflow:visible;"
82
+       inkscape:isstock="true">
83
+      <path
84
+         id="path8406"
85
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#fffffb;stroke-opacity:1;fill:#ffffff;fill-opacity:1"
86
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
87
+         transform="scale(1.1) rotate(180) translate(1,0)" />
88
+    </marker>
89
+    <marker
90
+       inkscape:stockid="Arrow2Mend"
91
+       orient="auto"
92
+       refY="0.0"
93
+       refX="0.0"
94
+       id="marker6628"
95
+       style="overflow:visible;"
96
+       inkscape:isstock="true">
97
+      <path
98
+         id="path6626"
99
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#fffffb;stroke-opacity:1;fill:#ffffff;fill-opacity:1"
100
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
101
+         transform="scale(0.6) rotate(180) translate(0,0)" />
102
+    </marker>
103
+    <marker
104
+       inkscape:stockid="Arrow2Send"
105
+       orient="auto"
106
+       refY="0.0"
107
+       refX="0.0"
108
+       id="Arrow2Send"
109
+       style="overflow:visible;"
110
+       inkscape:isstock="true">
111
+      <path
112
+         id="path5831"
113
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#fffffb;stroke-opacity:1;fill:#ffffff;fill-opacity:1"
114
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
115
+         transform="scale(0.3) rotate(180) translate(-2.3,0)" />
116
+    </marker>
117
+    <marker
118
+       inkscape:stockid="Arrow2Mend"
119
+       orient="auto"
120
+       refY="0.0"
121
+       refX="0.0"
122
+       id="Arrow2Mend"
123
+       style="overflow:visible;"
124
+       inkscape:isstock="true">
125
+      <path
126
+         id="path5825"
127
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1"
128
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
129
+         transform="scale(0.6) rotate(180) translate(0,0)" />
130
+    </marker>
131
+    <marker
132
+       inkscape:stockid="Arrow2Lend"
133
+       orient="auto"
134
+       refY="0.0"
135
+       refX="0.0"
136
+       id="Arrow2Lend"
137
+       style="overflow:visible;"
138
+       inkscape:isstock="true">
139
+      <path
140
+         id="path5819"
141
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1"
142
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
143
+         transform="scale(1.1) rotate(180) translate(1,0)" />
144
+    </marker>
145
+    <marker
146
+       inkscape:stockid="Arrow1Lend"
147
+       orient="auto"
148
+       refY="0.0"
149
+       refX="0.0"
150
+       id="Arrow1Lend"
151
+       style="overflow:visible;"
152
+       inkscape:isstock="true">
153
+      <path
154
+         id="path5801"
155
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
156
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
157
+         transform="scale(0.8) rotate(180) translate(12.5,0)" />
158
+    </marker>
47 159
     <linearGradient
48 160
        inkscape:collect="always"
49 161
        id="linearGradient6532">
... ...
@@ -160,6 +272,36 @@
160 272
          in2="BackgroundImage"
161 273
          id="feBlend4693-5" />
162 274
     </filter>
275
+    <marker
276
+       inkscape:stockid="TriangleOutM"
277
+       orient="auto"
278
+       refY="0"
279
+       refX="0"
280
+       id="TriangleOutM-7"
281
+       style="overflow:visible"
282
+       inkscape:isstock="true">
283
+      <path
284
+         inkscape:connector-curvature="0"
285
+         id="path5943-5"
286
+         d="M 5.77,0 -2.88,5 V -5 Z"
287
+         style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#fffffb;stroke-width:1.00000003pt;stroke-opacity:1"
288
+         transform="scale(0.4)" />
289
+    </marker>
290
+    <marker
291
+       inkscape:stockid="TriangleOutM"
292
+       orient="auto"
293
+       refY="0"
294
+       refX="0"
295
+       id="TriangleOutM-7-6"
296
+       style="overflow:visible"
297
+       inkscape:isstock="true">
298
+      <path
299
+         inkscape:connector-curvature="0"
300
+         id="path5943-5-2"
301
+         d="M 5.77,0 -2.88,5 V -5 Z"
302
+         style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#fffffb;stroke-width:1.00000003pt;stroke-opacity:1"
303
+         transform="scale(0.4)" />
304
+    </marker>
163 305
   </defs>
164 306
   <metadata
165 307
      id="metadata3145">
... ...
@@ -927,9 +1069,9 @@
927 1069
          y="278.75592"
928 1070
          inkscape:label="Airspeed-Trend-Indicator" />
929 1071
       <rect
930
-         style="display:inline;opacity:1;fill:#ff00ff;fill-opacity:1;stroke:none;stroke-width:0.26083553;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
1072
+         style="display:inline;opacity:1;fill:#ff00ff;fill-opacity:1;stroke:none;stroke-width:0.42460275;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
931 1073
          id="Altitude-Trend-Indicator"
932
-         width="3"
1074
+         width="7.9497476"
933 1075
          height="11.6"
934 1076
          x="704"
935 1077
          y="272.89999"
... ...
@@ -6893,7 +7035,109 @@
6893 7035
          height="54"
6894 7036
          width="80"
6895 7037
          id="WindData-bg"
6896
-         style="opacity:1;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
7038
+         style="display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
7039
+      <g
7040
+         id="WindData-OPTN2"
7041
+         inkscape:label="WindData-OPTN2"
7042
+         transform="matrix(0.94507049,7.5046918e-4,7.5046918e-4,1.0064403,300.41761,-34.744936)"
7043
+         style="display:inline">
7044
+        <text
7045
+           xml:space="preserve"
7046
+           style="font-style:normal;font-weight:normal;font-size:21.87422752px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
7047
+           x="-9.5834036"
7048
+           y="514.44525"
7049
+           id="WindData-OPTN2-crosswind-text"
7050
+           transform="rotate(-0.70051)"
7051
+           inkscape:label="WindData-OPTN2-crosswind-text"><tspan
7052
+             sodipodi:role="line"
7053
+             id="tspan11152"
7054
+             x="-9.5834036"
7055
+             y="514.44525"
7056
+             style="fill:#ffffff">99</tspan></text>
7057
+        <text
7058
+           xml:space="preserve"
7059
+           style="font-style:normal;font-weight:normal;font-size:21.87422752px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
7060
+           x="-31.885189"
7061
+           y="543.1496"
7062
+           id="WindData-OPTN2-headwind-text"
7063
+           transform="rotate(-0.70051)"
7064
+           inkscape:label="WindData-OPTN2-headwind-text"><tspan
7065
+             sodipodi:role="line"
7066
+             id="tspan11152-7"
7067
+             x="-31.885189"
7068
+             y="543.1496"
7069
+             style="fill:#ffffff">99</tspan></text>
7070
+        <g
7071
+           id="WindData-OPTN2-symbol"
7072
+           inkscape:label="WindData-OPTN2-symbol">
7073
+          <g
7074
+             style="display:inline;fill:#ffffff"
7075
+             id="WindData-OPTN2-headwind"
7076
+             transform="rotate(90,-69.568086,483.6217)"
7077
+             inkscape:label="WindData-OPTN2-headwind">
7078
+            <path
7079
+               inkscape:label="#g10970"
7080
+               style="opacity:1;fill:#ffffff;fill-rule:evenodd;stroke:#fffffb;stroke-width:3.14109135;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
7081
+               d="m -56.67437,453.74383 36.626025,-0.77773 v 0 0 l -8.808277,8.21371 -0.01179,-15.81125 8.820066,7.59754"
7082
+               id="g10970-5"
7083
+               inkscape:connector-curvature="0" />
7084
+          </g>
7085
+          <g
7086
+             style="display:inline;fill:#ffffff"
7087
+             id="WindData-OPTN2-crosswind"
7088
+             transform="matrix(1.1318615,0.01307176,-0.01476273,1.1366266,15.454336,-2.9082836)"
7089
+             inkscape:label="WindData-OPTN2-crosswind">
7090
+            <path
7091
+               inkscape:label="#g10970"
7092
+               style="opacity:1;fill:#ffffff;fill-rule:evenodd;stroke:#fffffb;stroke-width:2.9849999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
7093
+               d="m -56.499992,453.75001 32.57232,-0.79343 v 0 0 l -6.195986,-5.01221 0.137881,11.25986 6.058105,-6.24765"
7094
+               id="g10970-5-1"
7095
+               inkscape:connector-curvature="0" />
7096
+          </g>
7097
+        </g>
7098
+      </g>
7099
+      <g
7100
+         id="WindData-OPTN1"
7101
+         transform="rotate(0.70051,-2700.1427,25554.408)"
7102
+         inkscape:label="WindData-OPTN1"
7103
+         style="display:inline">
7104
+        <text
7105
+           xml:space="preserve"
7106
+           style="font-style:normal;font-weight:normal;font-size:18.66666603px;line-height:125%;font-family:sans-serif;text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
7107
+           x="16.583868"
7108
+           y="477.01712"
7109
+           id="WindData-OPTN1-SPD-text"
7110
+           inkscape:label="WindData-OPTN1-SPD-text"><tspan
7111
+             sodipodi:role="line"
7112
+             id="tspan10667-6"
7113
+             x="16.583868"
7114
+             y="477.01712"
7115
+             style="text-align:end;text-anchor:end;fill:#ffffff">99KT</tspan></text>
7116
+        <text
7117
+           xml:space="preserve"
7118
+           style="font-style:normal;font-weight:normal;font-size:17.33333397px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
7119
+           x="-24.043869"
7120
+           y="441.57062"
7121
+           id="WindData-OPTN1-HDG-text"
7122
+           inkscape:label="WindData-OPTN1-HDG-text"><tspan
7123
+             sodipodi:role="line"
7124
+             id="tspan10667"
7125
+             x="-24.043869"
7126
+             y="441.57062"
7127
+             style="fill:#ffffff">000°</tspan></text>
7128
+        <g
7129
+           id="WindData-OPTN1-HDG"
7130
+           transform="rotate(-90,-35.986581,453.05224)"
7131
+           inkscape:label="WindData-OPTN1-HDG"
7132
+           style="display:inline">
7133
+          <path
7134
+             inkscape:label="#g10970"
7135
+             style="opacity:1;fill:#ffffff;fill-rule:evenodd;stroke:#fffffb;stroke-width:3.28068852;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
7136
+             d="m -56.516052,453.7481 39.770571,-0.87723 v 0 0 l -12.312915,-6.96735 0.191895,15.69465 12.12102,-8.7273"
7137
+             id="g10970"
7138
+             inkscape:connector-curvature="0" />
7139
+        </g>
7140
+      </g>
6897 7141
     </g>
6898 7142
     <g
6899 7143
        id="BARO"
... ...
@@ -6990,12 +7234,12 @@
6990 7234
          inkscape:label="GSPD-text"
6991 7235
          id="GSPD-text"
6992 7236
          y="474.04486"
6993
-         x="92.75"
6994
-         style="font-style:normal;font-weight:normal;font-size:18.66666603px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
7237
+         x="92.749992"
7238
+         style="font-style:normal;font-weight:normal;font-size:18.66666603px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
6995 7239
          xml:space="preserve"><tspan
6996
-           style="fill:#ffffff"
7240
+           style="text-align:start;text-anchor:start;fill:#ffffff;"
6997 7241
            y="474.04486"
6998
-           x="92.75"
7242
+           x="149.47916"
6999 7243
            id="tspan4999"
7000 7244
            sodipodi:role="line">999KT</tspan></text>
7001 7245
     </g>
... ...
@@ -7028,12 +7272,12 @@
7028 7272
          id="TAS-text"
7029 7273
          y="474.04486"
7030 7274
          x="179.75"
7031
-         style="font-style:normal;font-weight:normal;font-size:18.66666603px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
7275
+         style="font-style:normal;font-weight:normal;font-size:18.66666603px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
7032 7276
          xml:space="preserve"
7033 7277
          inkscape:label="TAS-text"><tspan
7034
-           style="fill:#ffffff"
7278
+           style="text-align:start;text-anchor:start;fill:#ffffff;"
7035 7279
            y="474.04486"
7036
-           x="179.75"
7280
+           x="236.47916"
7037 7281
            id="tspan5015"
7038 7282
            sodipodi:role="line">999KT</tspan></text>
7039 7283
     </g>
... ...
@@ -7120,33 +7364,37 @@
7120 7364
          id="SelectedAlt-bug"
7121 7365
          d="m 702.995,273.07678 13.50494,0.0625 10e-6,4.92322 -9.00001,6.4375 9.00001,6.5625 -10e-6,4.12239 -13.50494,-0.0625 z"
7122 7366
          style="fill:#00ffff;stroke:none;stroke-width:1.00699997;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
7123
-      <rect
7124
-         inkscape:label="SelectedAlt-bg"
7125
-         y="82.54493"
7126
-         x="703.54492"
7127
-         height="30.910122"
7128
-         width="104.91015"
7129
-         id="SelectedAlt-bg"
7130
-         style="display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:1.08987784;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
7131
-      <path
7132
-         inkscape:label="selectedalt-symbol"
7133
-         sodipodi:nodetypes="cccccccc"
7134
-         inkscape:connector-curvature="0"
7135
-         id="selectedalt-symbol"
7136
-         d="m 708.11228,86.945933 13.50494,0.0625 10e-6,4.92322 -9.00001,6.4375 9.00001,6.562507 -10e-6,4.12239 -13.50494,-0.0625 z"
7137
-         style="display:inline;fill:#00ffff;stroke:none;stroke-width:1.00699997;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
7138
-      <text
7139
-         inkscape:label="SelectedAlt-text"
7140
-         id="SelectedAlt-text"
7141
-         y="106.73632"
7142
-         x="725.75"
7143
-         style="font-style:normal;font-weight:normal;font-size:24px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
7144
-         xml:space="preserve"><tspan
7145
-           style="fill:#ffffff"
7367
+      <g
7368
+         id="SelectedAlt-top"
7369
+         inkscape:label="SelectedAlt-top">
7370
+        <rect
7371
+           inkscape:label="SelectedAlt-bg"
7372
+           y="82.54493"
7373
+           x="703.54492"
7374
+           height="30.910122"
7375
+           width="104.91015"
7376
+           id="SelectedAlt-bg"
7377
+           style="display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:1.08987784;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
7378
+        <path
7379
+           inkscape:label="selectedalt-symbol"
7380
+           sodipodi:nodetypes="cccccccc"
7381
+           inkscape:connector-curvature="0"
7382
+           id="selectedalt-symbol"
7383
+           d="m 708.11228,86.945933 13.50494,0.0625 10e-6,4.92322 -9.00001,6.4375 9.00001,6.562507 -10e-6,4.12239 -13.50494,-0.0625 z"
7384
+           style="display:inline;fill:#00ffff;stroke:none;stroke-width:1.00699997;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
7385
+        <text
7386
+           inkscape:label="SelectedAlt-text"
7387
+           id="SelectedAlt-text"
7146 7388
            y="106.73632"
7147 7389
            x="725.75"
7148
-           id="tspan6644"
7149
-           sodipodi:role="line">99999</tspan></text>
7390
+           style="font-style:normal;font-weight:normal;font-size:24px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
7391
+           xml:space="preserve"><tspan
7392
+             style="fill:#ffffff"
7393
+             y="106.73632"
7394
+             x="725.75"
7395
+             id="tspan6644"
7396
+             sodipodi:role="line">99999</tspan></text>
7397
+      </g>
7150 7398
     </g>
7151 7399
   </g>
7152 7400
   <g
+1 -1
zkv1000.nas
... ...
@@ -52,7 +52,7 @@ var init_props = func {
52 52
     afcs.getNode('alt-bug-visible',1).setBoolValue(0);
53 53
     afcs.getNode('heading-bug-deg',1).setDoubleValue(getprop('/orientation/heading-magnetic-deg'));
54 54
     afcs.getNode('target-pitch-deg',1).setDoubleValue(0.0);
55
-    afcs.getNode('selected-alt-ft',1).setDoubleValue(0.0);
55
+    afcs.getNode('selected-alt-ft',1).setIntValue(2000);
56 56
     afcs.getNode('selected-alt-ft-diff',1).setDoubleValue(0.0);
57 57
     afcs.getNode('selected-ias-kt-diff',1).setDoubleValue(0.0);
58 58
     afcs.getNode('vertical-speed-fpm',1).setDoubleValue(0.0);