1 contributor
var selectNextWayPoint = func (_me_, command) {
var w = geo.Coord.new();
var r = geo.Coord.new();
var c = [];
var scratch = '/instrumentation/gps/scratch/';
w.set_latlon(getprop(_me_.map_path ~ '/latitude-deg'),
getprop(_me_.map_path ~ '/longitude-deg'));
lockSearches();
foreach (var t; ['fix', 'airport', 'vor', 'ndb']) {
searchNearestNavaid(t, 3, _me_.map_path);
while (getprop(scratch ~ '/has-next')) {
r.set_latlon(getprop(scratch ~ 'latitude-deg'),
getprop(scratch ~ 'longitude-deg'));
append(c, [ w.distance_to(r),
getprop(scratch ~ 'name'),
getprop(scratch ~ 'ident'),
getprop(scratch ~ 'mag-bearing-deg'),
t
]
);
setprop('/instrumentation/gps/command', 'next');
}
}
unlockSearches();
c = sort(c, func (a,b) { return a[0] - b[0] });
_me_.mud.wipe();
var action = '';
if (command == 'dto') {
_me_.mud.setTitle('DIRECT TO...');
action = 'direct to '
}
else {
_me_.mud.setTitle('SELECT A WAYPOINT');
action = 'appended to route ';
}
_me_.mud.add(['CANCEL'], func { _me_.mud.close() });
_me_.mud.add(['HERE'], func {
var n = 'instrumentation/gps/scratch/';
lockSearches();
setprop(n ~ 'longitude-deg', _me_.map_path ~ '/longitude-deg');
setprop(n ~ 'latitude-deg', _me_.map_path ~ '/latitude-deg');
setprop(n ~ 'type', 'USER');
setprop(n ~ 'name', 'USER WAYPOINT');
setprop(n ~ 'ident', '---');
setprop(n ~ 'index', -1);
setprop(n ~ '../command', command);
unlockSearches();
msg(action ~ 'unnamed waypoint');
});
for (var i = 0; i < size(c) and c[i][0] < 18520 and i < 10; i += 1) { # only the 10 nearest and distance < 10NM
_me_.mud.add(
[c[i][1], sprintf('%s -- DST %.1fNM BRG %03i', c[i][2], c[i][0] / 1852, c[i][3])],
func {
var n = '/instrumentation/gps/scratch/';
lockSearches();
setprop(n ~ 'longitude-deg', getprop(_me_.map_path ~ '/longitude-deg'));
setprop(n ~ 'latitude-deg', getprop(_me_.map_path ~ '/latitude-deg'));
setprop(n ~ 'type', arg[0][0]);
setprop(n ~ 'query', arg[0][1]);
setprop(n ~ 'order-by-range', 1);
setprop(n ~ 'exact', 1);
setprop(n ~ '../command', 'search');
setprop(n ~ 'index', -1);
setprop(n ~ '../command', command);
unlockSearches();
msg(action ~ arg[0][0] ~ ' ' ~ arg[0][1]);
},
[ c[i][4], c[i][2] ]
);
}
c = nil;
_me_.mud.open(1); # allow wrapping
_me_.mud.select(); # select the first entry
_me_.mud.select(1); # select HERE;
if (size(_me_.mud.content) > 2) _me_.mud.select(1); # select nearest navaid if available
_me_.largeFMSknob = func (dir) { _me_.mud.select(dir) };
}
showSearchResults = func (mud, title, freq, callback) {
var scratch = '/instrumentation/gps/scratch/';
mud.wipe();
mud.setTitle(title);
while (getprop(scratch ~ 'has-next')) {
mud.add([getprop(scratch ~ 'name'),
sprintf('%s -- DST %.1fNM BRG %03i',
getprop(scratch ~ 'ident'),
getprop(scratch ~ 'distance-nm'),
getprop(scratch ~ 'mag-bearing-deg')
)],
callback,
[ getprop(scratch ~ freq), getprop(scratch ~ 'ident'), getprop(scratch ~ 'type') ]);
setprop('/instrumentation/gps/command', 'next');
}
mud.open();
mud.select();
}
var selectSearchType = func (mud, dir) {
lockSearches();
var title = mud.node.getNode('title').getValue();
if (title == 'NEAREST AIRPORTS') {
searchNearestNavaid('vor', 5);
showSearchResults(mud, 'NEAREST VOR', 'frequency-mhz',
func { msg('set NAV1 standby freq to: ' ~ arg[0][0] ~ 'MHz');
setprop('/instrumentation/nav/frequencies/standby-mhz', arg[0][0])
}
);
}
elsif (title == 'NEAREST VOR') {
searchNearestNavaid('ndb', 5);
showSearchResults(mud, 'NEAREST NDB', 'frequency-khz',
func { msg('set ADF standby freq to ' ~ arg[0][0] ~ 'kHz');
setprop('/instrumentation/adf/frequencies/standby-khz', arg[0][0])
}
);
}
elsif (title == 'NEAREST NDB') {
searchNearestNavaid('airport', 10);
showSearchResults(mud, 'NEAREST AIRPORTS', 'mag-bearing-deg',
func { msg('set HDG to ' ~ arg[0][0]);
setprop('/instrumentation/zkv1000/afcs/heading-bug-deg', arg[0][0])
}
);
}
unlockSearches();
}
var showAvailableFPL = func (_me_) {
var files = [];
var mud = _me_.mud;
foreach (var subdir; ['/zkv1000/routes/', '/Routes/']) { # compatibility with zkv500 route store path
var path = getprop('/sim/fg-home') ~ subdir;
var s = io.stat(path);
(s != nil and s[11] == 'dir') or continue;
foreach (var f; directory(path)) {
if (f[0] != `.` and substr(f, -4) == '.xml') append(files, path ~ f);
}
}
if (size(files) == 0) {
msg('unable to find a directory containing routes');
return;
}
files = sort(files, func (a,b) { a[0] - b[0] });
mud.wipe();
mud.setTitle('STORED FLIGHTPLANS');
mud.add(['CANCEL'], func { mud.close(mud) });
for (var i = 0; i < size(files); i += 1) {
mud.add([string.uc(split('.', split('/', files[i])[-1])[0])], loadFPLfromFile, files[i]);
}
mud.open(1); # allow wrapping
mud.select(); # select CANCEL
if (size(mud.content) > 1) mud.select(1); # select first entry if exists
_me_.largeFMSknob = func (dir) { mud.select(dir) }
}