5 <resizable>true</resizable>
6 <draggable>true</draggable>
10 var deg_norm = func(deg, min, max) {
16 return int(deg * 10 + 0.5) / 10;
19 var deg2dm = func(deg) {
22 return i + frac * 0.6;
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);
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
38 var dialog_name = props.Node.new({"dialog-name": "nav"});
39 fgcommand("dialog-close", dialog_name);
40 fgcommand("dialog-show", dialog_name);
43 var calculate = func {
44 var fp = flightplan();
45 var fp_size = fp.getPlanSize();
49 var wpB = fp.getWP(0);
50 var wpE = fp.getWP(fp_size - 1);
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)));
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)));
65 var faz = wpE.courseAndDistanceFrom(wpB.lat, wpB.lon)[0];
66 var baz = wpB.courseAndDistanceFrom(wpE.lat, wpE.lon)[0];
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));
75 route.removeChildren("leg");
76 list.removeChildren("value");
77 var dist_total = wpE.distance_along_route * 1.852;
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;
85 ZPU = deg_norm(ZPU, 0, 360);
87 var wp1 = fp.getWP(i);
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,
100 var beacon = route.getChild("beacon", i - 1);
102 var b = beacon.getValues();
103 var name = split(" ", b.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,
111 list.getChild("value", i - 1, 1).setValue(descr);
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);
120 var beacon_add = func {
121 var i = getprop("tu154/systems/nvu-calc/selected") + 1;
122 var ident = getprop("tu154/systems/nvu-calc/ident");
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);
134 var (b, d) = wp1.courseAndDistanceFrom(vor.lat, vor.lon);
135 b = (wp0.leg_bearing - b) / 57.2958;
137 var S = -d * math.cos(b);
138 var Z = d * math.sin(b);
140 route.getChild("beacon", i - 1, 1).setValues({
143 freq: vor.frequency / 100,
146 UK: deg_norm(wp0.leg_bearing, 0, 360),
150 var beacon_remove = func {
151 route.removeChild("beacon", getprop("tu154/systems/nvu-calc/selected"));
154 var load_selected = func {
155 var i = getprop("tu154/systems/nvu-calc/selected");
159 setprop("tu154/systems/nvu/leg-next", i);
160 instruments.nvu_calculator_load();
167 <!-- Leave this empty or fix close/open on fork toggle first. -->
172 <layout>hbox</layout>
174 <empty><stretch>1</stretch></empty>
177 <label>NVU Calculator</label>
180 <empty><stretch>1</stretch></empty>
183 <pref-width>16</pref-width>
184 <pref-height>16</pref-height>
189 <command>dialog-apply</command>
192 <command>dialog-close</command>
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>
208 <command>dialog-apply</command>
211 <command>dialog-update</command>
212 <object-name>list</object-name>
217 <layout>hbox</layout>
218 <default-padding>4</default-padding>
221 <label> Departure mag var:</label>
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>
229 <command>dialog-apply</command>
232 <command>nasal</command>
233 <script>calculate()</script>
236 <command>dialog-update</command>
240 <property>tu154/systems/nvu-calc/magvar-dep-at-loc</property>
242 <command>dialog-apply</command>
245 <command>nasal</command>
246 <script>calculate()</script>
249 <command>dialog-update</command>
253 <label>at location Destination mag var:</label>
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>
261 <command>dialog-apply</command>
264 <command>nasal</command>
265 <script>calculate()</script>
268 <command>dialog-update</command>
272 <property>tu154/systems/nvu-calc/magvar-dest-at-loc</property>
274 <command>dialog-apply</command>
277 <command>nasal</command>
278 <script>calculate()</script>
281 <command>dialog-update</command>
285 <label>at location </label>
288 <label>Fork: -179.54' (-179.9)</label>
289 <format>Fork: %s</format>
290 <property>tu154/systems/nvu-calc/fork-str</property>
293 <empty><stretch>1</stretch></empty>
296 <legend>Load selected</legend>
297 <pref-width>120</pref-width>
299 <command>nasal</command>
300 <script>load_selected()</script>
308 <layout>hbox</layout>
309 <default-padding>4</default-padding>
312 <label> Beacon ident for selected leg:</label>
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>
323 <pref-width>50</pref-width>
325 <command>dialog-apply</command>
328 <command>nasal</command>
329 <script>beacon_add(); calculate()</script>
332 <command>dialog-update</command>
336 <legend>Remove beacon</legend>
337 <pref-width>120</pref-width>
339 <command>dialog-apply</command>
342 <command>nasal</command>
343 <script>beacon_remove(); calculate()</script>
346 <command>dialog-update</command>
350 <empty><stretch>1</stretch></empty>
353 <property>tu154/systems/nvu-calc/virtual-navigator</property>
355 <command>dialog-apply</command>
359 <label>Virtual navigator</label>
362 <empty><stretch>1</stretch></empty>
365 <legend>Apply fork</legend>
366 <pref-width>100</pref-width>
368 <command>dialog-apply</command>
371 <command>nasal</command>
372 <script>toggle_fork(); calculate()</script>
376 <property>tu154/systems/nvu-calc/fork-only-route</property>
378 <command>dialog-apply</command>
382 <label>only update route </label>