1 contributor
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
var TcasItemClass = {
new : func(canvasGroup, index) {
var m = {parents : [TcasItemClass]};
m._group = canvasGroup.createChild("group", "TcasItem_" ~ index);
canvas.parsesvg(m._group, data.zkv1000_reldir ~ "Models/tcas.svg");
m._can = {
Alt : [
m._group.getElementById("Alt_above").setVisible(0),
m._group.getElementById("Alt_below").setVisible(0)
],
Arrow : [
m._group.getElementById("Arrow_climb").setVisible(0),
m._group.getElementById("Arrow_descent").setVisible(0)
]
};
m._can.ThreadLevel = [];
for (var i=0; i<4; i+=1)
append(m._can.ThreadLevel,
m._group.getElementById("Thread_Level_" ~ i).setVisible(0));
m._colors = [ '#00ffff', '#00ffff', '#ff7f2a', '#ff0000' ];
return m;
},
setData : func(lat, lon, alt, vs, level) {
me._group.setVisible(1);
me._group.setGeoPosition(lat, lon);
if (alt == 0) {
me._can.Alt[0].setVisible(0);
me._can.Alt[1].setVisible(0);
}
else {
me._can.Alt[alt < 0]
.setText(sprintf("%+i", alt))
.set('fill', me._colors[level])
.setVisible(1);
me._can.Alt[alt > 0].setVisible(0);
}
if (vs >= -3 and vs <= 3) {
me._can.Arrow[0].setVisible(0);
me._can.Arrow[1].setVisible(0);
}
else {
me._can.Arrow[vs < -3]
.set('fill', me._colors[level])
.set('stroke', me._colors[level])
.setVisible(1);
me._can.Arrow[vs > 3].setVisible(0);
}
me._can.ThreadLevel[0].setVisible(level == 0);
me._can.ThreadLevel[1].setVisible(level == 1);
me._can.ThreadLevel[2].setVisible(level == 2);
me._can.ThreadLevel[3].setVisible(level == 3);
me._group.set("z-index", level + 1);
},
};
var MapTcas = {
new : func(device, group) {
var m = {parents:[MapTcas]};
m.device = device;
if (getprop('/instrumentation/tcas/serviceable') == nil) {
m.update = func;
m.setVisible = func;
}
else {
m.visibility = 0;
m.group = group.createChild('map', 'tcas')
.setTranslation(
m.device.role == 'MFD' ? (m.device.data.mapview[0] + m.device.data.mapclip.left)/2 : 120,
m.device.role == 'MFD' ? 400 : 600)
.setVisible(m.visibility);
m._item = [];
m._itemIndex = 0;
m._itemCount = 0;
m.MODE = ["Normal","Above","Unlimited","Below"];
}
if (m.device.role == 'PFD')
m.device.softkeys.colored.INSETTRAFFIC = 1;
if (m.device.role == 'MFD')
m.device.softkeys.colored.MAPTRAFFIC = 1;
return m;
},
update : func() {
if (me.device.data.tcas == 0)
return;
me.group._node.getNode('ref-lat', 1).setDoubleValue(data.lat);
me.group._node.getNode('ref-lon', 1).setDoubleValue(data.lon);
me.group._node
.getNode('range', 1).setDoubleValue(me.device.data['range-factor']);
me._itemIndex = 0;
foreach (var ac; data.tcas) {
if (me._itemIndex >= me._itemCount) {
append(me._item, TcasItemClass.new(me.group, me._itemIndex));
me._itemCount += 1;
}
me._item[me._itemIndex].setData(ac.lat, ac.lon, ac.alt, ac.vs, ac.level);
me._itemIndex += 1;
}
for (; me._itemIndex < me._itemCount; me._itemIndex += 1) {
me._item[me._itemIndex]._group.setVisible(0);
}
},
setVisible : func (v) {
me.group.setVisible(v);
},
};