52373760e2
This fixes bogus indexing warnings and thus Nasal failures when processing certain kinds of FlightPlan leg, such as discontinuities and skipped legs.
101 lines
2.6 KiB
Text
101 lines
2.6 KiB
Text
# See: http://wiki.flightgear.org/MapStructure
|
|
# Class things:
|
|
var name = 'WPT'; # for waypoints
|
|
var parents = [SymbolLayer.Controller];
|
|
var __self__ = caller(0)[0];
|
|
SymbolLayer.Controller.add(name, __self__);
|
|
SymbolLayer.add(name, {
|
|
parents: [MultiSymbolLayer],
|
|
type: name, # Symbol type
|
|
df_controller: __self__, # controller to use by default -- this one
|
|
df_options: { # default configuration options
|
|
active_node: "/autopilot/route-manager/active",
|
|
current_wp_node: "/autopilot/route-manager/current-wp",
|
|
wp_num: "/autopilot/route-manager/route/num",
|
|
}
|
|
});
|
|
var new = func(layer) {
|
|
var m = {
|
|
parents: [__self__],
|
|
layer: layer,
|
|
options: layer.options,
|
|
map: layer.map,
|
|
listeners: [],
|
|
};
|
|
layer.searcher._equals = func(l,r) l.equals(r);
|
|
append(m.listeners, setlistener(layer.options.active_node, func m.layer.update() ), setlistener(layer.options.wp_num, func m.layer.update() ));
|
|
var driver = opt_member(m.layer.options, 'route_driver');
|
|
if(driver == nil){
|
|
driver = RouteDriver.new();
|
|
}
|
|
var driver_listeners = driver.getListeners();
|
|
foreach(var listener; driver_listeners){
|
|
append(m.listeners, setlistener(listener, func m.layer.update()));
|
|
}
|
|
m.route_driver = driver;
|
|
m.addVisibilityListener();
|
|
|
|
return m;
|
|
};
|
|
var del = func() {
|
|
#print(name~"VOR.lcontroller.del()");
|
|
foreach (var l; me.listeners)
|
|
removelistener(l);
|
|
};
|
|
|
|
var WPT_model = {
|
|
new: func(fp, idx, offset=0) {
|
|
var m = { parents:[WPT_model], idx:(idx+offset) };
|
|
var wp = fp.getWP(idx);
|
|
m.name = wp.wp_name;
|
|
|
|
var alt = wp.alt_cstr;
|
|
if (alt != 0)
|
|
m.name ~= "\n"~alt;
|
|
|
|
if (idx > 0) {
|
|
var path = wp.path();
|
|
# check for empty path
|
|
if (size(path) == 0)
|
|
return nil;
|
|
var n = wp.path()[-1];
|
|
} else {
|
|
var wp2idx = 1; # next waypoint
|
|
if (fp.getPlanSize() == 1) # if only have one wpt then it must be at element 0.
|
|
wp2idx = 0;
|
|
var path = fp.getWP(wp2idx).path();
|
|
if (size(path) == 0)
|
|
return nil;
|
|
var n = fp.getWP(wp2idx).path()[0];
|
|
}
|
|
|
|
(m.lat,m.lon) = (n.lat,n.lon);
|
|
return m;
|
|
},
|
|
equals: func(other) {
|
|
# this is set on symbol init, so use this for equality...
|
|
me.name == other.name
|
|
},
|
|
};
|
|
|
|
var searchCmd = func {
|
|
printlog(_MP_dbg_lvl, "Running query: "~name);
|
|
|
|
if (!getprop(me.options.active_node)) return [];
|
|
var driver = me.route_driver;
|
|
driver.update();
|
|
var result = [];
|
|
var planCount = driver.getNumberOfFlightPlans();
|
|
for(var idx = 0; idx < planCount; idx += 1){
|
|
var fp = driver.getFlightPlan(idx);
|
|
var fpSize = fp.getPlanSize(idx);
|
|
|
|
for (var i = 0; i < fpSize; i+=1) {
|
|
var wm = WPT_model.new(fp, i);
|
|
if (wm != nil)
|
|
append(result, wm);
|
|
}
|
|
}
|
|
return result;
|
|
};
|
|
|