112 lines
3.7 KiB
Text
112 lines
3.7 KiB
Text
# See: http://wiki.flightgear.org/MapStructure
|
|
# Class things:
|
|
var name = 'HOLD';
|
|
var parents = [canvas.SymbolLayer.Controller];
|
|
var __self__ = caller(0)[0];
|
|
|
|
canvas.SymbolLayer.Controller.add(name, __self__);
|
|
canvas.SymbolLayer.add(name, {
|
|
parents: [MultiSymbolLayer],
|
|
type: name, # Symbol type
|
|
df_controller: __self__, # controller to use by default -- this one
|
|
});
|
|
var new = func(layer) {
|
|
var m = {
|
|
parents: [__self__],
|
|
layer: layer,
|
|
map: layer.map,
|
|
listeners: [],
|
|
};
|
|
#debug.dump(layer.parents);
|
|
layer.searcher._equals = func(a,b) a.id == b.id;
|
|
#append(m.listeners, setlistener(layer.options.fplan_active, func m.layer.update() ));
|
|
#m.addVisibilityListener();
|
|
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;
|
|
|
|
return m;
|
|
};
|
|
|
|
var del = func() {
|
|
foreach (var l; me.listeners)
|
|
removelistener(l);
|
|
};
|
|
|
|
var searchCmd = func {
|
|
var driver = me.route_driver;
|
|
if(!driver.shouldUpdate()) return [];
|
|
driver.update();
|
|
var results = [];
|
|
var planCount = driver.getNumberOfFlightPlans();
|
|
var cur_fp = flightplan();
|
|
var cur_wp = cur_fp.getWP();
|
|
var next_wp = nil;
|
|
if (cur_wp != nil)
|
|
next_wp = cur_fp.getWP(cur_wp.index + 1);
|
|
var range = me.map.getRange();
|
|
if (range == nil) range = 0;
|
|
for(var idx = 0; idx < planCount; idx += 1){
|
|
var patterns = me.route_driver.getHoldPatterns(idx);
|
|
if (typeof(patterns) == 'vector') {
|
|
foreach (var pattern; patterns) {
|
|
var wp = pattern['wp'];
|
|
if (wp == nil) continue;
|
|
var wp_id = wp.id;
|
|
var wp_idx = wp.index;
|
|
var node = pattern['node'];
|
|
if (node == nil) continue;
|
|
var pointsNode = node.getNode('points');
|
|
var pointNode = nil;
|
|
if(pointsNode != nil)
|
|
pointNode = pointsNode.getNode('point', 0);
|
|
if (pointNode == nil) continue;
|
|
var r = pattern['crs'];
|
|
var d = pattern['dist'];
|
|
var t = pattern['turn'];
|
|
if (r == nil or d == nil or t == nil) continue;
|
|
var active = node.getValue('active') == 1;
|
|
var fpId = pattern['fpId'];
|
|
var type = 'hold_symbol';
|
|
var sfx = '-inactive';
|
|
if (fpId == 'active' or fpId == 'temporary') {
|
|
if (range <= 160) {
|
|
if ((cur_wp != nil and cur_wp.index == wp_idx) or
|
|
(next_wp != nil and next_wp.index == wp_idx)) {
|
|
type = 'pattern';
|
|
sfx = '';
|
|
}
|
|
}
|
|
}
|
|
var lat = wp.wp_lat;
|
|
var lon = wp.wp_lon;
|
|
var model = {
|
|
parents: [geo.Coord],
|
|
id: wp_id~r~d~t~sfx,
|
|
pos: {lat: lat, lon: lon},
|
|
type: type,
|
|
latlon: func(){
|
|
return [
|
|
me.pos.lat,
|
|
me.pos.lon
|
|
];
|
|
},
|
|
radial: r,
|
|
dist: d,
|
|
turn: t,
|
|
fpId: fpId,
|
|
equals: func(o){me.id == o.id}
|
|
};
|
|
append(results, model);
|
|
}
|
|
}
|
|
}
|
|
|
|
return results;
|
|
}
|