Showing 4 changed files with 134 additions and 101 deletions
+5 -3
Nasal/core.nas
... ...
@@ -41,18 +41,20 @@ var deviceClass = {
41 41
         m.knobs    = knobsClass.new(m.node);
42 42
         m.softkeys = softkeysClass.new(m.node, m.role);
43 43
         m.display.loadsvg();
44
-        m.display.loadGroup({hide : [ 
44
+        m.display.loadGroup({
45
+            hide : [
45 46
                 'Failures',
46 47
                 'SoftKeysTexts',
47 48
                 'PFD-Widgets', 
48
-#                'MFD-Widgets',
49 49
                 'COMM',
50 50
                 'XPDR-TIME', 
51 51
                 'NAV',
52 52
                 'FlightInstruments', 
53 53
                 'VDI',
54 54
                 'OMI',
55
-        ]});
55
+            ],
56
+            clip : 'PitchScale',
57
+        });
56 58
         zkv.getNode(m.role ~ 'init').setIntValue(0);
57 59
         m.setstatus(d + 1);
58 60
         return m;
+28 -3
Nasal/display.nas
... ...
@@ -39,8 +39,10 @@ var displayClass = {
39 39
                     'COMM', 
40 40
                     'NAV', 
41 41
                     'XPDR-TIME', 
42
-                    'FlightInstruments' 
42
+                    'FlightInstruments',
43
+                    'Horizon',
43 44
             ]});
45
+            me.updateAi(getprop('/orientation/roll-deg'),getprop('orientation/pitch-deg'));
44 46
             me.progress.removeAllChildren();
45 47
             me.progress = nil;
46 48
             me.showInitProgress = nil;
... ...
@@ -83,8 +85,16 @@ var displayClass = {
83 85
                 me.screenElements[e].hide();
84 86
             elsif (t == 'show')
85 87
                 me.screenElements[e].show();
86
-            elsif (t == 'rot' or t == 'trans')
87
-                me.screenElements[e].createTransform();
88
+            elsif (t == 'rot' or t == 'trans') {
89
+                if (! contains(me.screenElements[e], t))
90
+                    me.screenElements[e][t] = me.screenElements[e].createTransform();
91
+            }
92
+            elsif (t == 'clip') {
93
+                if (contains(me.clips, e))
94
+                    me.screenElements[e].set("clip", me.clips[e]);
95
+                else
96
+                    print('no defined clip for ' ~ e);
97
+            }
88 98
             else
89 99
                 print('unknown method ' ~ t);
90 100
         };
... ...
@@ -103,4 +113,19 @@ var displayClass = {
103 113
             }
104 114
         }
105 115
     },
116
+
117
+    clips : {
118
+        PitchScale : "rect(70,664,370,256)",
119
+    },
120
+
121
+    updateAi: func(roll,pitch){
122
+        if (pitch > 80)
123
+            pitch = 80;
124
+        elsif(pitch < -80)
125
+            pitch = -80;
126
+        me.screenElements.Horizon
127
+            .setRotation(-roll * D2R)
128
+            .setTranslation(0, pitch * 6.8571428);
129
+        settimer(func me.updateAi(getprop('/orientation/roll-deg'),getprop('orientation/pitch-deg')), 0.1);
130
+    },
106 131
 };
+20 -18
README.md
... ...
@@ -20,21 +20,23 @@
20 20
 Cet instrument était prévu pour s'approcher du Garmin Primus 1000. Au début il était écrit avec une multitude de petits objets 3D placés sur l'écran avec un
21 21
 écart suffisament faible pour que le pilote ait l'impression d'un vrai écran 2D.  
22 22
 
23
-Il incluait aussi un moyen de rafraîchir les écrans sans altérer la vitesse d'affichage avec un système de rotation de fonctions qui chacune l'une après l'autre
23
+J'avais écrit le ZKV500 qui se rapprochait d'un GPS Garmin 500, donc ZKV1000 semblait tout indiqué :-), ZKV pour Zakharov...  
24
+
25
+Le ZKV1000 ancien (version XML) incluait aussi un moyen de rafraîchir les écrans sans altérer la vitesse d'affichage avec un système de rotation de fonctions qui chacune l'une après l'autre
24 26
 s'occupait d'un seul ou d'un petit groupe d'élément à des fréquences diverses. Que l'instrument ne freine pas le simulateur était primordial.  
25 27
 
26
-Le zkv1000 ancien incluait aussi une carte qui nécessitait d'être créée au préalable via ImageMagick et un autre outil dont j'ai perdu le nom. Le script aussi a disparu mais en gros il créeait
27
-une carte en collant les bordures des cartes adjacentes à celle dans laquelle l'appareil se trouvait.  Ça marchait mais le rendu était pas terrible, très peu flexible.  
28
+Le zkv1000 ancien incluait aussi une carte qui nécessitait d'être créée au préalable via ImageMagick et un autre outil de FG dont j'ai perdu le nom. Le script en Perl créeait
29
+une carte en collant les bordures des cartes adjacentes à celle dans laquelle l'appareil se trouvait, avec ImageMagick.  Ça marchait mais le rendu était pas terrible, très peu flexible (pas de zoom, pas de génération à la volée).  
28 30
 
29
-Abandonné, le zkv1000 a été amélioré un peu par d'autres dont j'ai oublié le nom notamment l'apport du radar de relief, mais la façon de faire n'optimisait pas du tout
31
+J'ai abandonné le zkv1000 par les aléeas de la vie, il a été amélioré un peu par d'autres dont j'ai oublié le nom notamment l'apport du radar de relief, mais la façon de faire n'optimisait pas du tout
30 32
 la vitesse d'affichage, et à moins d'avoir une bête de course le radar était inutilisable.
31 33
 
32
-Il incluait aussi un ensemble de menus, avec navigation par les boutons, et une recherche des balises et aéroports, ainsi qu'un calculateur de trajectoire 
34
+Le zkv1000 incluait aussi un ensemble de menus intégrés, avec navigation par les boutons, et une recherche des balises et aéroports, ainsi qu'un calculateur de trajectoire 
33 35
 simple (balise à balise).  
34 36
 
35 37
 Regardant de temps à autre ce que devenait FG je découvrais Canvas, le SVG, et les premières réalisations de PFD/MFD avec ce nouveau jouet.  
36 38
 
37
-Trop tentant, il fallait essayer de rendre le zkv1000 Canvas-compliant. Et l'aventure commence!
39
+Trop tentant, il fallait essayer de rendre le zkv1000 Canvas-compliant. Et l'aventure (re)commence!
38 40
 
39 41
 # Objectifs
40 42
 Il ne sert à rien d'essayer de reproduire à l'identique le Garmin Primus 1000, d'autres y arriveront bien mieux que moi pour créer une copie fidèle.  
... ...
@@ -43,40 +45,40 @@ Vous êtes prévenus!
43 45
 
44 46
 Dans ce projet je privilégie particulièrement  
45 47
 
46
-1.  la modularité pour des éviolutions futures
47
-1.  l'optimisation, enfin... supposée, mes qualités de dev ne sont probablement assez élevées ;)
48
+1.  la modularité pour des évolutions futures
49
+1.  l'optimisation, enfin... supposée, mes qualités de dev' ne sont probablement assez élevées ;)
48 50
 1.  une intégration la plus simple possible dans n'importe quel appareil
49 51
 1.  une utilisation qui se veut proche de ce que fait l'instrument de référence, mais en y intégrant les avantages d'être dans un simulateur et pas dans la vie réelle:
50 52
     *   ajout de fonctionnalités spécifiques
51
-    *   retraits de fonctionnalités peu utiles
53
+    *   retraits de fonctionnalités peu utiles dans un simulateur
52 54
 
53 55
 # État acuel
54
-J'ai récupéré sur l'avion Extra500 l'implémentation du Garmin Primus 1000, et notamment les objets 3D, et les SVG. Les objets 3D sont bien plus jolis que ceux du premier zkv1000, et le SVG est très complet.
56
+J'ai récupéré l'implémentation du GDU-104X (je ne sais plus où) l'implémentation du Garmin Primus 1000, et notamment les objets 3D, et les SVG. Les objets 3D sont bien plus jolis que ceux du premier zkv1000 (le .ac de l'ancien était tout cassé, pas réussi à réparer), et le SVG comportait déjà beaucoup d'éléments.
55 57
 
56 58
 ## général
57
-![][10%]  
58
-**INUTILISABLE**  
59
+![][20%]  
60
+**de moins en moins INUTILISABLE**  
59 61
 
60 62
 * double-écran ![][30%]: pas d'écran de MFD, uniquement PFD 
61
-* ![][ongoing]animations écrans ![][10%]: l'animation de l'affichage n'est pas du tout géré, mais les bases sont là
63
+* ![][ongoing]animations écrans ![][20%]: wrapper pour l'affichage des objets (et plus), AI fonctionnel, VS, ALT et IAS, Compas à suivre, 
62 64
 * animation modèle 3D ![][90%]: les boutons et molettes fonctionnent (radio, comm, softkey, etc.), il manque les textures pour les botons du MFD
63 65
 
64 66
 ## dans le détail
65 67
 * apprentissage:
66
-  * Canvas ![][40%]
68
+  * Canvas ![][50%]
67 69
   * SVG
68
-    * InkScape ![][50%] (enfin pour les besoins du zkv1000)
70
+    * InkScape ![][60%] (enfin pour les besoins du zkv1000)
69 71
     * format ![][50%]
70 72
   * archi de l'image importée ![][70%] (avec modification directe dans Vim)
71 73
 * XML ![][80%]
72
-* ![][ongoing]structure Nasal ![][50%]:
74
+* ![][ongoing]structure Nasal ![][60%]:
73 75
   * en apprendre plus sur les classes (les parents multiples)
74
-  * la  possibilité de gérer le zkv1000 par la console Nasal
76
+  * enfin retrouvée la  possibilité de gérer le zkv1000 par la console Nasal et même le nouvel REPL ![][100%]
75 77
 
76 78
 ## feuille de route
77 79
 1. avoir un PFD utilisable avec les fonctions de base, sans radio-navigation ![][10%]
78 80
 1. afficher l'EIS ![][0%]
79
-1. afficher les widgets du PFD ![][0%]
81
+1. afficher les widgets du PFD ![][10%]
80 82
 1. rendre disponible le MFD ![][0%]
81 83
 
82 84
 # documentation
+81 -77
Systems/screen.svg
... ...
@@ -39,7 +39,9 @@
39 39
      inkscape:window-maximized="1"
40 40
      inkscape:snap-grids="true"
41 41
      inkscape:snap-to-guides="true"
42
-     inkscape:object-paths="true" />
42
+     inkscape:object-paths="true"
43
+     inkscape:measure-start="461.034,2788.5"
44
+     inkscape:measure-end="459.63,483.503" />
43 45
   <defs
44 46
      id="defs3142">
45 47
     <linearGradient
... ...
@@ -136,18 +138,6 @@
136 138
        x2="401.00098"
137 139
        y2="-263.58203"
138 140
        gradientUnits="userSpaceOnUse" />
139
-    <clipPath
140
-       clipPathUnits="userSpaceOnUse"
141
-       id="clipPath5750">
142
-      <rect
143
-         style="fill:none;stroke:none;stroke-width:1.0144949;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
144
-         id="rect5752"
145
-         width="439.49249"
146
-         height="335.02554"
147
-         x="239"
148
-         y="55.236343"
149
-         inkscape:label="Clip-attitude" />
150
-    </clipPath>
151 141
     <clipPath
152 142
        clipPathUnits="userSpaceOnUse"
153 143
        id="clipPath6101">
... ...
@@ -238,12 +228,17 @@
238 228
      style="display:inline">
239 229
     <g
240 230
        style="display:inline"
241
-       inkscape:label="horizon"
242
-       id="layer4">
231
+       inkscape:label="Horizon"
232
+       id="Horizon"
233
+       inkscape:transform-center-x="0.62976698"
234
+       inkscape:transform-center-y="-1.0827573">
243 235
       <g
244 236
          style="display:inline"
245
-         id="Horizon"
246
-         transform="translate(-14.6369,-1.1372986)">
237
+         id="SkyAndGround"
238
+         transform="translate(-14.6369,-1.1372986)"
239
+         inkscape:label="SkyAndGround"
240
+         inkscape:transform-center-x="1"
241
+         inkscape:transform-center-y="-1.25">
247 242
         <rect
248 243
            style="fill:#004cff;fill-opacity:1;stroke:none"
249 244
            id="rect4014"
... ...
@@ -264,68 +259,77 @@
264 259
          id="HorizonLine"
265 260
          d="M -1076.5,284.50001 H 1995.5001"
266 261
          style="display:inline;fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
267
-         inkscape:label="#HorizonLine" />
262
+         inkscape:label="HorizonLine" />
268 263
       <g
269 264
          id="PitchScale"
270 265
          inkscape:transform-center-y="-0.2578125"
271 266
          transform="translate(0,0.25779785)"
272
-         clip-path="url(#clipPath5750)">
273
-        <path
274
-           style="display:inline;fill:#ff3200;fill-opacity:1;fill-rule:evenodd;stroke:none"
275
-           d="m 423.336,557.32 h 19.03901 l 17.125,-51.13265 17.125,51.13265 h 19.039 l -24.539,-65.44498 h -23.25 z"
276
-           id="use7417"
277
-           inkscape:connector-curvature="0"
278
-           inkscape:tile-x0="423.336"
279
-           inkscape:tile-y0="491.87502" />
280
-        <path
281
-           inkscape:tile-y0="491.87502"
282
-           inkscape:tile-x0="423.336"
283
-           inkscape:connector-curvature="0"
284
-           id="use7419"
285
-           d="m 423.336,625.76498 h 19.03901 l 17.125,-51.13265 17.125,51.13265 h 19.039 L 471.12501,560.32 h -23.25 z"
286
-           style="display:inline;fill:#ff3200;fill-opacity:1;fill-rule:evenodd;stroke:none" />
287
-        <path
288
-           inkscape:tile-y0="491.87502"
289
-           inkscape:tile-x0="423.336"
290
-           inkscape:connector-curvature="0"
291
-           id="use7421"
292
-           d="m 423.336,694.20996 h 19.03901 l 17.125,-51.13265 17.125,51.13265 h 19.039 l -24.539,-65.44498 h -23.25 z"
293
-           style="display:inline;fill:#ff3200;fill-opacity:1;fill-rule:evenodd;stroke:none" />
294
-        <path
295
-           inkscape:tile-y0="491.87502"
296
-           inkscape:tile-x0="423.336"
297
-           inkscape:connector-curvature="0"
298
-           id="use7423"
299
-           d="m 423.336,762.65493 h 19.03901 l 17.125,-51.13265 17.125,51.13265 h 19.039 l -24.539,-65.44498 h -23.25 z"
300
-           style="display:inline;fill:#ff3200;fill-opacity:1;fill-rule:evenodd;stroke:none" />
301
-        <path
302
-           inkscape:tile-y0="491.87502"
303
-           inkscape:tile-x0="423.336"
304
-           inkscape:connector-curvature="0"
305
-           id="use7425"
306
-           d="m 423.336,831.09991 h 19.03901 l 17.125,-51.13265 17.125,51.13265 h 19.039 l -24.539,-65.44498 h -23.25 z"
307
-           style="display:inline;fill:#ff3200;fill-opacity:1;fill-rule:evenodd;stroke:none" />
308
-        <path
309
-           style="fill:#ff3200;fill-opacity:1;fill-rule:evenodd;stroke:none"
310
-           d="M 423.33599,-262.0778 H 442.375 l 17.125,51.13265 17.125,-51.13265 h 19.039 l -24.539,65.44498 h -23.25 z"
311
-           id="use7411"
312
-           inkscape:connector-curvature="0"
313
-           inkscape:tile-x0="423.33599"
314
-           inkscape:tile-y0="-262.0778" />
315
-        <path
316
-           style="fill:#ff3200;fill-opacity:1;fill-rule:evenodd;stroke:none"
317
-           d="M 423.33599,-193.63282 H 442.375 l 17.125,51.13265 17.125,-51.13265 h 19.039 l -24.539,65.44498 h -23.25 z"
318
-           id="use7413"
319
-           inkscape:connector-curvature="0"
320
-           inkscape:tile-x0="423.33599"
321
-           inkscape:tile-y0="-262.0778" />
322
-        <path
323
-           style="fill:#ff3200;fill-opacity:1;fill-rule:evenodd;stroke:none"
324
-           d="M 423.33599,-125.18784 H 442.375 l 17.125,51.13265 17.125,-51.13265 h 19.039 l -24.539,65.44498 h -23.25 z"
325
-           id="use7415"
326
-           inkscape:connector-curvature="0"
327
-           inkscape:tile-x0="423.33599"
328
-           inkscape:tile-y0="-262.0778" />
267
+         clip-path="none"
268
+         style="display:inline">
269
+        <g
270
+           id="Chevrons.-30"
271
+           inkscape:label="Chevrons.-30">
272
+          <path
273
+             inkscape:tile-y0="491.87502"
274
+             inkscape:tile-x0="423.336"
275
+             inkscape:connector-curvature="0"
276
+             id="use7417"
277
+             d="m 423.336,557.32 h 19.03901 l 17.125,-51.13265 17.125,51.13265 h 19.039 l -24.539,-65.44498 h -23.25 z"
278
+             style="display:inline;fill:#ff3200;fill-opacity:1;fill-rule:evenodd;stroke:none" />
279
+          <path
280
+             style="display:inline;fill:#ff3200;fill-opacity:1;fill-rule:evenodd;stroke:none"
281
+             d="m 423.336,625.76498 h 19.03901 l 17.125,-51.13265 17.125,51.13265 h 19.039 L 471.12501,560.32 h -23.25 z"
282
+             id="use7419"
283
+             inkscape:connector-curvature="0"
284
+             inkscape:tile-x0="423.336"
285
+             inkscape:tile-y0="491.87502" />
286
+          <path
287
+             style="display:inline;fill:#ff3200;fill-opacity:1;fill-rule:evenodd;stroke:none"
288
+             d="m 423.336,694.20996 h 19.03901 l 17.125,-51.13265 17.125,51.13265 h 19.039 l -24.539,-65.44498 h -23.25 z"
289
+             id="use7421"
290
+             inkscape:connector-curvature="0"
291
+             inkscape:tile-x0="423.336"
292
+             inkscape:tile-y0="491.87502" />
293
+          <path
294
+             style="display:inline;fill:#ff3200;fill-opacity:1;fill-rule:evenodd;stroke:none"
295
+             d="m 423.336,762.65493 h 19.03901 l 17.125,-51.13265 17.125,51.13265 h 19.039 l -24.539,-65.44498 h -23.25 z"
296
+             id="use7423"
297
+             inkscape:connector-curvature="0"
298
+             inkscape:tile-x0="423.336"
299
+             inkscape:tile-y0="491.87502" />
300
+          <path
301
+             style="display:inline;fill:#ff3200;fill-opacity:1;fill-rule:evenodd;stroke:none"
302
+             d="m 423.336,831.09991 h 19.03901 l 17.125,-51.13265 17.125,51.13265 h 19.039 l -24.539,-65.44498 h -23.25 z"
303
+             id="use7425"
304
+             inkscape:connector-curvature="0"
305
+             inkscape:tile-x0="423.336"
306
+             inkscape:tile-y0="491.87502" />
307
+        </g>
308
+        <g
309
+           id="Chevrons.50"
310
+           inkscape:label="Chevrons.50">
311
+          <path
312
+             inkscape:tile-y0="-262.0778"
313
+             inkscape:tile-x0="423.33599"
314
+             inkscape:connector-curvature="0"
315
+             id="use7411"
316
+             d="M 423.33599,-262.0778 H 442.375 l 17.125,51.13265 17.125,-51.13265 h 19.039 l -24.539,65.44498 h -23.25 z"
317
+             style="fill:#ff3200;fill-opacity:1;fill-rule:evenodd;stroke:none" />
318
+          <path
319
+             inkscape:tile-y0="-262.0778"
320
+             inkscape:tile-x0="423.33599"
321
+             inkscape:connector-curvature="0"
322
+             id="use7413"
323
+             d="M 423.33599,-193.63282 H 442.375 l 17.125,51.13265 17.125,-51.13265 h 19.039 l -24.539,65.44498 h -23.25 z"
324
+             style="fill:#ff3200;fill-opacity:1;fill-rule:evenodd;stroke:none" />
325
+          <path
326
+             inkscape:tile-y0="-262.0778"
327
+             inkscape:tile-x0="423.33599"
328
+             inkscape:connector-curvature="0"
329
+             id="use7415"
330
+             d="M 423.33599,-125.18784 H 442.375 l 17.125,51.13265 17.125,-51.13265 h 19.039 l -24.539,65.44498 h -23.25 z"
331
+             style="fill:#ff3200;fill-opacity:1;fill-rule:evenodd;stroke:none" />
332
+        </g>
329 333
         <g
330 334
            inkscape:tile-y0="213.99985"
331 335
            inkscape:tile-x0="404.47864"
... ...
@@ -4525,7 +4529,7 @@
4525 4529
            sodipodi:role="line">1</tspan><tspan
4526 4530
            style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:120.00000477%;font-family:sans-serif;-inkscape-font-specification:'Sans, Normal';text-align:end;writing-mode:lr-tb;text-anchor:end;fill:#ffffff;fill-opacity:1"
4527 4531
            y="294.37515"
4528
-           x="233.68744"
4532
+           x="224.13666"
4529 4533
            sodipodi:role="line"
4530 4534
            id="tspan5009">0</tspan></text>
4531 4535
       <g
... ...
@@ -7532,7 +7536,7 @@
7532 7536
   <g
7533 7537
      id="Failures"
7534 7538
      inkscape:label="Failures"
7535
-     style="display:none">
7539
+     style="display:inline">
7536 7540
     <g
7537 7541
        id="NoAttitude"
7538 7542
        transform="translate(0.00225444,0.25658069)"