1
0
Fork 0
fgdata/Nasal/canvas/map/WPT.lcontroller
James Turner 52373760e2 Canvas Map: tolerate empty paths in waypoints
This fixes bogus indexing warnings and thus Nasal failures when
processing certain kinds of FlightPlan leg, such as discontinuities
and skipped legs.
2019-06-24 16:39:51 +01:00

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;
};