# 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 { logprint(_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; };