Tu-154B2 version 3.1:
[fg:toms-fgdata.git] / Aircraft / tu154b / Dialogs / nav.xml
1 <?xml version="1.0"?>
2 <PropertyList>
3   <name>nav</name>
4   <layout>vbox</layout>
5   <resizable>true</resizable>
6   <draggable>true</draggable>
7
8   <nasal>
9     <open>
10       var deg_norm = func(deg, min, max) {
11           while (min > deg)
12               deg += (max - min);
13           while (deg >= max)
14               deg -= (max - min);
15
16           return int(deg * 10 + 0.5) / 10;
17       }
18
19       var deg2dm = func(deg) {
20           var i = int(deg);
21           var frac = deg - i;
22           return i + frac * 0.6;
23       }
24
25       var dialog = cmdarg();
26       var list = dialog.getNode("list");
27       var fork_btn_legend = dialog.getNode("group[2]/button[2]/legend", 1);
28       var route = props.globals.getNode("tu154/systems/nvu-calc/route", 1);
29       var selected = props.globals.getNode("tu154/systems/nvu-calc/selected", 1);
30       selected.setIntValue(-1);
31
32       var toggle_fork = func {
33           var fork_applied = getprop("tu154/systems/nvu-calc/fork-applied");
34           setprop("tu154/systems/nvu-calc/fork-applied", !fork_applied);
35           fork_btn_legend.setValue(fork_applied ? "Apply fork" : "Revert fork");
36           # For legend change to take effect the only way is to reopen
37           # the dialog.
38           var dialog_name = props.Node.new({"dialog-name": "nav"});
39           fgcommand("dialog-close", dialog_name);
40           fgcommand("dialog-show", dialog_name);
41       }
42
43       var calculate = func {
44           var fp = flightplan();
45           var fp_size = fp.getPlanSize();
46           if (2 > fp_size)
47               return;
48
49           var wpB = fp.getWP(0);
50           var wpE = fp.getWP(fp_size - 1);
51
52           var magvar_dep =
53               num(getprop("tu154/systems/nvu-calc/magvar-dep")) or 0;
54           if (getprop("tu154/systems/nvu-calc/magvar-dep-at-loc"))
55               magvar_dep = magvar(wpB.lat, wpB.lon);
56           setprop("tu154/systems/nvu-calc/magvar-dep",
57                   sprintf("%+.1f", deg_norm(magvar_dep, -180, 180)));
58           var magvar_dest =
59               num(getprop("tu154/systems/nvu-calc/magvar-dest")) or 0;
60           if (getprop("tu154/systems/nvu-calc/magvar-dest-at-loc"))
61               magvar_dest = magvar(wpE.lat, wpE.lon);
62           setprop("tu154/systems/nvu-calc/magvar-dest",
63                   sprintf("%+.1f", deg_norm(magvar_dest, -180, 180)));
64
65           var faz = wpE.courseAndDistanceFrom(wpB.lat, wpB.lon)[0];
66           var baz = wpB.courseAndDistanceFrom(wpE.lat, wpE.lon)[0];
67
68           var fork_applied = getprop("tu154/systems/nvu-calc/fork-applied");
69           var fork = magvar_dep - magvar_dest - (faz - (baz - 180));
70           var fork_norm = deg_norm(fork, -180, 180);
71           setprop("tu154/systems/nvu-calc/fork", fork_norm);
72           setprop("tu154/systems/nvu-calc/fork-str",
73                   sprintf("%+.2f' (%+.1f)", deg2dm(fork_norm), fork_norm));
74
75           route.removeChildren("leg");
76           list.removeChildren("value");
77           var dist_total = wpE.distance_along_route * 1.852;
78           var wp0 = wpB;
79           var az_corr = 0;
80           for (var i = 1; fp_size > i; i += 1) {
81               var S = -wp0.leg_distance * 1.852;
82               var ZPU = wp0.leg_bearing - magvar_dep + az_corr;
83               if (fork_applied)
84                   ZPU += fork;
85               ZPU = deg_norm(ZPU, 0, 360);
86
87               var wp1 = fp.getWP(i);
88               var leg = {
89                   from: wp0.wp_name,
90                   to: wp1.wp_name,
91                   S: S,
92                   ZPU: ZPU,
93               };
94               route.getChild("leg", i - 1, 1).setValues(leg);
95               var dist = dist_total - wp0.distance_along_route * 1.852;
96               var descr = sprintf("% 3d: %s - %s (%.1f km),"
97                                   ~" S: %+.1f km, ZPU: %06.2f'",
98                                   i, leg.from, leg.to, dist, leg.S,
99                                   deg2dm(leg.ZPU));
100               var beacon = route.getChild("beacon", i - 1);
101               if (beacon != nil) {
102                   var b = beacon.getValues();
103                   var name = split(" ", b.name);
104                   pop(name);
105                   name = string.join(" ", name);
106                   descr ~= sprintf(", beacon %s (%s %.2f mhz),"
107                                    ~ " S: %+.1f km, Z: %+.1f km, UK: %06.2f'",
108                                    name, b.ident, b.freq, b.S, b.Z,
109                                    deg2dm(b.UK));
110               }
111               list.getChild("value", i - 1, 1).setValue(descr);
112
113               var faz = wp1.courseAndDistanceFrom(wpB.lat, wpB.lon)[0];
114               var baz = wpB.courseAndDistanceFrom(wp1.lat, wp1.lon)[0];
115               az_corr = faz - (baz - 180);
116               wp0 = wp1;
117           }
118       }
119
120       var beacon_add = func {
121           var i = getprop("tu154/systems/nvu-calc/selected") + 1;
122           var ident = getprop("tu154/systems/nvu-calc/ident");
123           if (!i or !ident)
124               return;
125
126           var fp = flightplan();
127           var wp0 = fp.getWP(i - 1);
128           var wp1 = fp.getWP(i);
129           var vors = navinfo(wp1.lat, wp1.lon, "vor", ident);
130           if (!size(vors))
131               return;
132
133           var vor = vors[0];
134           var (b, d) = wp1.courseAndDistanceFrom(vor.lat, vor.lon);
135           b = (wp0.leg_bearing - b) / 57.2958;
136           d *= 1.852;
137           var S = -d * math.cos(b);
138           var Z = d * math.sin(b);
139
140           route.getChild("beacon", i - 1, 1).setValues({
141               name: vor.name,
142               ident: vor.id,
143               freq: vor.frequency / 100,
144               S: S,
145               Z: Z,
146               UK: deg_norm(wp0.leg_bearing, 0, 360),
147           });
148       }
149
150       var beacon_remove = func {
151          route.removeChild("beacon", getprop("tu154/systems/nvu-calc/selected"));
152       }
153
154       var load_selected = func {
155           var i = getprop("tu154/systems/nvu-calc/selected");
156           if (i == -1)
157               return;
158
159           setprop("tu154/systems/nvu/leg-next", i);
160           instruments.nvu_calculator_load();
161       }
162
163       calculate();
164     </open>
165
166     <close>
167       <!-- Leave this empty or fix close/open on fork toggle first. -->
168     </close>
169   </nasal>
170
171   <group>
172     <layout>hbox</layout>
173
174     <empty><stretch>1</stretch></empty>
175
176     <text>
177       <label>NVU Calculator</label>
178     </text>
179
180     <empty><stretch>1</stretch></empty>
181
182     <button>
183       <pref-width>16</pref-width>
184       <pref-height>16</pref-height>
185       <legend></legend>
186       <key>Esc</key>
187       <border>2</border>
188       <binding>
189         <command>dialog-apply</command>
190       </binding>
191       <binding>
192         <command>dialog-close</command>
193       </binding>
194     </button>
195   </group>
196
197   <hrule/>
198
199   <list>
200     <name>result</name>
201     <halign>fill</halign>
202     <valign>fill</valign>
203     <stretch>true</stretch>
204     <pref-width>600</pref-width>
205     <pref-height>400</pref-height>
206     <property>tu154/systems/nvu-calc/selected</property>
207     <binding>
208       <command>dialog-apply</command>
209     </binding>
210     <binding>
211       <command>dialog-update</command>
212       <object-name>list</object-name>
213     </binding>
214   </list>
215
216   <group>
217     <layout>hbox</layout>
218     <default-padding>4</default-padding>
219
220     <text>
221       <label> Departure mag var:</label>
222     </text>
223     <input>
224       <name>input-magvar-dep</name>
225       <stretch>false</stretch>
226       <pref-width>80</pref-width>
227       <property>tu154/systems/nvu-calc/magvar-dep</property>
228       <binding>
229         <command>dialog-apply</command>
230       </binding>
231       <binding>
232         <command>nasal</command>
233         <script>calculate()</script>
234       </binding>
235       <binding>
236         <command>dialog-update</command>
237       </binding>
238     </input>
239     <checkbox>
240       <property>tu154/systems/nvu-calc/magvar-dep-at-loc</property>
241       <binding>
242         <command>dialog-apply</command>
243       </binding>
244       <binding>
245         <command>nasal</command>
246         <script>calculate()</script>
247       </binding>
248       <binding>
249         <command>dialog-update</command>
250       </binding>
251     </checkbox>
252     <text>
253       <label>at location    Destination mag var:</label>
254     </text>
255     <input>
256       <name>input-magvar-dest</name>
257       <stretch>false</stretch>
258       <pref-width>80</pref-width>
259       <property>tu154/systems/nvu-calc/magvar-dest</property>
260       <binding>
261         <command>dialog-apply</command>
262       </binding>
263       <binding>
264         <command>nasal</command>
265         <script>calculate()</script>
266       </binding>
267       <binding>
268         <command>dialog-update</command>
269       </binding>
270     </input>
271     <checkbox>
272       <property>tu154/systems/nvu-calc/magvar-dest-at-loc</property>
273       <binding>
274         <command>dialog-apply</command>
275       </binding>
276       <binding>
277         <command>nasal</command>
278         <script>calculate()</script>
279       </binding>
280       <binding>
281         <command>dialog-update</command>
282       </binding>
283     </checkbox>
284     <text>
285       <label>at location    </label>
286     </text>
287     <text>
288       <label>Fork: -179.54' (-179.9)</label>
289       <format>Fork: %s</format>
290       <property>tu154/systems/nvu-calc/fork-str</property>
291     </text>
292
293     <empty><stretch>1</stretch></empty>
294
295     <button>
296       <legend>Load selected</legend>
297       <pref-width>120</pref-width>
298       <binding>
299         <command>nasal</command>
300         <script>load_selected()</script>
301       </binding>
302     </button>
303   </group>
304
305   <hrule/>
306
307   <group>
308     <layout>hbox</layout>
309     <default-padding>4</default-padding>
310
311     <text>
312       <label> Beacon ident for selected leg:</label>
313     </text>
314     <input>
315       <name>input-ident</name>
316       <halign>fill</halign>
317       <stretch>false</stretch>
318       <pref-width>80</pref-width>
319       <property>tu154/systems/nvu-calc/ident</property>
320     </input>
321     <button>
322       <legend>Add</legend>
323       <pref-width>50</pref-width>
324       <binding>
325         <command>dialog-apply</command>
326       </binding>
327       <binding>
328         <command>nasal</command>
329         <script>beacon_add(); calculate()</script>
330       </binding>
331       <binding>
332         <command>dialog-update</command>
333       </binding>
334     </button>
335     <button>
336       <legend>Remove beacon</legend>
337       <pref-width>120</pref-width>
338       <binding>
339         <command>dialog-apply</command>
340       </binding>
341       <binding>
342         <command>nasal</command>
343         <script>beacon_remove(); calculate()</script>
344       </binding>
345       <binding>
346         <command>dialog-update</command>
347       </binding>
348     </button>
349
350     <empty><stretch>1</stretch></empty>
351
352     <checkbox>
353       <property>tu154/systems/nvu-calc/virtual-navigator</property>
354       <binding>
355         <command>dialog-apply</command>
356       </binding>
357     </checkbox>
358     <text>
359       <label>Virtual navigator</label>
360     </text>
361
362     <empty><stretch>1</stretch></empty>
363
364     <button>
365       <legend>Apply fork</legend>
366       <pref-width>100</pref-width>
367       <binding>
368         <command>dialog-apply</command>
369       </binding>
370       <binding>
371         <command>nasal</command>
372         <script>toggle_fork(); calculate()</script>
373       </binding>
374     </button>
375     <checkbox>
376       <property>tu154/systems/nvu-calc/fork-only-route</property>
377       <binding>
378         <command>dialog-apply</command>
379       </binding>
380     </checkbox>
381     <text>
382       <label>only update route </label>
383     </text>
384   </group>
385
386 </PropertyList>