1 |
|
---|
2 | from mlx.gui.common import *
|
---|
3 |
|
---|
4 | import mlx.const as const
|
---|
5 | import mlx.util as util
|
---|
6 |
|
---|
7 | import time
|
---|
8 |
|
---|
9 | #------------------------------------------------------------------------------
|
---|
10 |
|
---|
11 | ## @package mlx.gui.monitor
|
---|
12 | #
|
---|
13 | # The monitoring window
|
---|
14 | #
|
---|
15 | # The \ref MonitorWindow class is a window containing the data received from
|
---|
16 | # the simulator by the logger.
|
---|
17 |
|
---|
18 | #------------------------------------------------------------------------------
|
---|
19 |
|
---|
20 | class MonitorWindow(gtk.Window):
|
---|
21 | """The window for the data monitor."""
|
---|
22 | def __init__(self, gui, iconDirectory):
|
---|
23 | """Construct the monitor window."""
|
---|
24 | super(MonitorWindow, self).__init__()
|
---|
25 |
|
---|
26 | self._gui = gui
|
---|
27 |
|
---|
28 | self.set_resizable(False)
|
---|
29 | self.set_title(WINDOW_TITLE_BASE + " - Data Monitor")
|
---|
30 | self.set_icon_from_file(os.path.join(iconDirectory, "logo.ico"))
|
---|
31 | self.connect("delete-event",
|
---|
32 | lambda a, b: self._gui.hideMonitorWindow())
|
---|
33 |
|
---|
34 | alignment = gtk.Alignment(xscale = 1.0, yscale = 1.0)
|
---|
35 |
|
---|
36 | alignment.set_padding(padding_top = 4, padding_bottom = 10,
|
---|
37 | padding_left = 16, padding_right = 16)
|
---|
38 |
|
---|
39 | table = gtk.Table(rows = 7, columns = 14)
|
---|
40 | table.set_homogeneous(False)
|
---|
41 | table.set_row_spacings(4)
|
---|
42 | table.set_col_spacings(8)
|
---|
43 |
|
---|
44 | (label, self._timestamp) = self._createLabeledEntry("Time:")
|
---|
45 | table.attach(label, 0, 1, 0, 1)
|
---|
46 | table.attach(self._timestamp, 1, 2, 0, 1)
|
---|
47 |
|
---|
48 | self._paused = gtk.Label("PAUSED")
|
---|
49 | table.attach(self._paused, 2, 4, 0, 1)
|
---|
50 |
|
---|
51 | self._trickMode = gtk.Label("TRICKMODE")
|
---|
52 | table.attach(self._trickMode, 4, 6, 0, 1, xoptions = 0)
|
---|
53 |
|
---|
54 | self._overspeed = gtk.Label("OVERSPEED")
|
---|
55 | table.attach(self._overspeed, 6, 8, 0, 1)
|
---|
56 |
|
---|
57 | self._stalled = gtk.Label("STALLED")
|
---|
58 | table.attach(self._stalled, 8, 10, 0, 1)
|
---|
59 |
|
---|
60 | self._onTheGround = gtk.Label("ONTHEGROUND")
|
---|
61 | table.attach(self._onTheGround, 10, 12, 0, 1)
|
---|
62 |
|
---|
63 | (label, self._zfw) = self._createLabeledEntry("ZFW:", 6)
|
---|
64 | table.attach(label, 0, 1, 1, 2)
|
---|
65 | table.attach(self._zfw, 1, 2, 1, 2)
|
---|
66 |
|
---|
67 | (label, self._grossWeight) = self._createLabeledEntry("Weight:", 6)
|
---|
68 | table.attach(label, 2, 3, 1, 2)
|
---|
69 | table.attach(self._grossWeight, 3, 4, 1, 2)
|
---|
70 |
|
---|
71 | (label, self._heading) = self._createLabeledEntry("Heading:", 3)
|
---|
72 | table.attach(label, 4, 5, 1, 2)
|
---|
73 | table.attach(self._heading, 5, 6, 1, 2)
|
---|
74 |
|
---|
75 | (label, self._pitch) = self._createLabeledEntry("Pitch:", 3)
|
---|
76 | table.attach(label, 6, 7, 1, 2)
|
---|
77 | table.attach(self._pitch, 7, 8, 1, 2)
|
---|
78 |
|
---|
79 | (label, self._bank) = self._createLabeledEntry("Bank:", 3)
|
---|
80 | table.attach(label, 8, 9, 1, 2)
|
---|
81 | table.attach(self._bank, 9, 10, 1, 2)
|
---|
82 |
|
---|
83 | (label, self._vs) = self._createLabeledEntry("VS:", 13)
|
---|
84 | table.attach(label, 10, 11, 1, 2)
|
---|
85 | table.attach(self._vs, 11, 12, 1, 2)
|
---|
86 |
|
---|
87 | (label, self._ias) = self._createLabeledEntry("IAS:", 11)
|
---|
88 | table.attach(label, 0, 1, 2, 3)
|
---|
89 | table.attach(self._ias, 1, 2, 2, 3)
|
---|
90 |
|
---|
91 | (label, self._mach) = self._createLabeledEntry("Mach:", 4)
|
---|
92 | table.attach(label, 2, 3, 2, 3)
|
---|
93 | table.attach(self._mach, 3, 4, 2, 3)
|
---|
94 |
|
---|
95 | (label, self._groundSpeed) = self._createLabeledEntry("GS:", 4)
|
---|
96 | table.attach(label, 4, 5, 2, 3)
|
---|
97 | table.attach(self._groundSpeed, 5, 6, 2, 3)
|
---|
98 |
|
---|
99 | (label, self._radioAltitude) = self._createLabeledEntry("Radio alt.:", 6)
|
---|
100 | table.attach(label, 6, 7, 2, 3)
|
---|
101 | table.attach(self._radioAltitude, 7, 8, 2, 3)
|
---|
102 |
|
---|
103 | (label, self._altitude) = self._createLabeledEntry("Altitude:", 6)
|
---|
104 | table.attach(label, 8, 9, 2, 3)
|
---|
105 | table.attach(self._altitude, 9, 10, 2, 3)
|
---|
106 |
|
---|
107 | (label, self._gLoad) = self._createLabeledEntry("G-Load:", 4)
|
---|
108 | table.attach(label, 10, 11, 2, 3)
|
---|
109 | table.attach(self._gLoad, 11, 12, 2, 3)
|
---|
110 |
|
---|
111 | (label, self._flapsSet) = self._createLabeledEntry("Flaps set:", 2)
|
---|
112 | table.attach(label, 0, 1, 3, 4)
|
---|
113 | table.attach(self._flapsSet, 1, 2, 3, 4)
|
---|
114 |
|
---|
115 | (label, self._flaps) = self._createLabeledEntry("Flaps:", 2)
|
---|
116 | table.attach(label, 2, 3, 3, 4)
|
---|
117 | table.attach(self._flaps, 3, 4, 3, 4)
|
---|
118 |
|
---|
119 | (label, self._altimeter) = self._createLabeledEntry("Altimeter:", 4)
|
---|
120 | table.attach(label, 4, 5, 3, 4)
|
---|
121 | table.attach(self._altimeter, 5, 6, 3, 4)
|
---|
122 |
|
---|
123 | (label, self._squawk) = self._createLabeledEntry("Squawk:", 4)
|
---|
124 | table.attach(label, 6, 7, 3, 4)
|
---|
125 | table.attach(self._squawk, 7, 8, 3, 4)
|
---|
126 |
|
---|
127 | (label, self._nav1) = self._createLabeledEntry("NAV1:", 5)
|
---|
128 | table.attach(label, 8, 9, 3, 4)
|
---|
129 | table.attach(self._nav1, 9, 10, 3, 4)
|
---|
130 |
|
---|
131 | (label, self._nav2) = self._createLabeledEntry("NAV2:", 5)
|
---|
132 | table.attach(label, 10, 11, 3, 4)
|
---|
133 | table.attach(self._nav2, 11, 12, 3, 4)
|
---|
134 |
|
---|
135 | (label, self._fuel) = self._createLabeledEntry("Fuel:", 40, xalign = 0.0)
|
---|
136 | table.attach(label, 0, 1, 4, 5)
|
---|
137 | table.attach(self._fuel, 1, 4, 4, 5)
|
---|
138 |
|
---|
139 | (label, self._n1) = self._createLabeledEntry("N1/RPM:", 20, xalign = 0.0)
|
---|
140 | table.attach(label, 4, 5, 4, 5)
|
---|
141 | table.attach(self._n1, 5, 8, 4, 5)
|
---|
142 |
|
---|
143 | (label, self._reverser) = self._createLabeledEntry("Reverser:", 20, xalign = 0.0)
|
---|
144 | table.attach(label, 8, 9, 4, 5)
|
---|
145 | table.attach(self._reverser, 9, 12, 4, 5)
|
---|
146 |
|
---|
147 | self._navLightsOn = gtk.Label("NAV")
|
---|
148 | table.attach(self._navLightsOn, 0, 1, 5, 6)
|
---|
149 |
|
---|
150 | self._antiCollisionLightsOn = gtk.Label("ANTICOLLISION")
|
---|
151 | table.attach(self._antiCollisionLightsOn, 1, 2, 5, 6)
|
---|
152 |
|
---|
153 | self._strobeLightsOn = gtk.Label("STROBE")
|
---|
154 | table.attach(self._strobeLightsOn, 2, 3, 5, 6)
|
---|
155 |
|
---|
156 | self._landingLightsOn = gtk.Label("LANDING")
|
---|
157 | table.attach(self._landingLightsOn, 3, 4, 5, 6)
|
---|
158 |
|
---|
159 | self._pitotHeatOn = gtk.Label("PITOT HEAT")
|
---|
160 | table.attach(self._pitotHeatOn, 4, 5, 5, 6)
|
---|
161 |
|
---|
162 | self._parking = gtk.Label("PARKING")
|
---|
163 | table.attach(self._parking, 5, 6, 5, 6)
|
---|
164 |
|
---|
165 | self._gearControlDown = gtk.Label("GEAR LEVER DOWN")
|
---|
166 | table.attach(self._gearControlDown, 6, 8, 5, 6)
|
---|
167 |
|
---|
168 | self._gearsDown = gtk.Label("GEARS DOWN")
|
---|
169 | table.attach(self._gearsDown, 8, 10, 5, 6)
|
---|
170 |
|
---|
171 | self._spoilersArmed = gtk.Label("SPOILERS ARMED")
|
---|
172 | table.attach(self._spoilersArmed, 10, 12, 5, 6)
|
---|
173 |
|
---|
174 | (label, self._spoilersExtension) = self._createLabeledEntry("Spoilers:", 3)
|
---|
175 | table.attach(label, 0, 1, 6, 7)
|
---|
176 | table.attach(self._spoilersExtension, 1, 2, 6, 7)
|
---|
177 |
|
---|
178 | (label, self._windSpeed) = self._createLabeledEntry("Wind speed:", 3)
|
---|
179 | table.attach(label, 2, 3, 6, 7)
|
---|
180 | table.attach(self._windSpeed, 3, 4, 6, 7)
|
---|
181 |
|
---|
182 | (label, self._windDirection) = self._createLabeledEntry("Wind from:", 3)
|
---|
183 | table.attach(label, 4, 5, 6, 7)
|
---|
184 | table.attach(self._windDirection, 5, 6, 6, 7)
|
---|
185 |
|
---|
186 | (label, self._position) = self._createLabeledEntry("Position:", 25)
|
---|
187 | table.attach(label, 6, 7, 6, 7)
|
---|
188 | table.attach(self._position, 7, 10, 6, 7)
|
---|
189 |
|
---|
190 | (label, self._elevatorTrim) = self._createLabeledEntry("Trim:", 5)
|
---|
191 | table.attach(label, 10, 11, 6, 7)
|
---|
192 | table.attach(self._elevatorTrim, 11, 12, 6, 7)
|
---|
193 |
|
---|
194 | self._apMaster = gtk.Label("AP MASTER")
|
---|
195 | table.attach(self._apMaster, 0, 1, 7, 8)
|
---|
196 |
|
---|
197 | self._apHeadingHold = gtk.Label("AP HDG HOLD")
|
---|
198 | table.attach(self._apHeadingHold, 1, 2, 7, 8)
|
---|
199 |
|
---|
200 | (label, self._apHeading) = self._createLabeledEntry("AP HDG:", 5)
|
---|
201 | table.attach(label, 2, 3, 7, 8)
|
---|
202 | table.attach(self._apHeading, 3, 4, 7, 8)
|
---|
203 |
|
---|
204 | self._xpdrC = gtk.Label("XPDR C")
|
---|
205 | table.attach(self._xpdrC, 4, 5, 7, 8)
|
---|
206 |
|
---|
207 | self._apAltitudeHold = gtk.Label("AP ALT HOLD")
|
---|
208 | table.attach(self._apAltitudeHold, 5, 6, 7, 8)
|
---|
209 |
|
---|
210 | (label, self._apAltitude) = self._createLabeledEntry("AP ALT:", 10)
|
---|
211 | table.attach(label, 6, 7, 7, 8)
|
---|
212 | table.attach(self._apAltitude, 7, 8, 7, 8)
|
---|
213 |
|
---|
214 | (label, self._adf1) = self._createLabeledEntry("ADF1:", 5)
|
---|
215 | table.attach(label, 8, 9, 7, 8)
|
---|
216 | table.attach(self._adf1, 9, 10, 7, 8)
|
---|
217 |
|
---|
218 | (label, self._adf2) = self._createLabeledEntry("ADF2:", 5)
|
---|
219 | table.attach(label, 10, 11, 7, 8)
|
---|
220 | table.attach(self._adf2, 11, 12, 7, 8)
|
---|
221 |
|
---|
222 | alignment.add(table)
|
---|
223 |
|
---|
224 | self.add(alignment)
|
---|
225 |
|
---|
226 | self._previousState = None
|
---|
227 |
|
---|
228 | self.setData()
|
---|
229 |
|
---|
230 | def _createLabeledEntry(self, label, width = 8, xalign = 1.0):
|
---|
231 | """Create a labeled entry.
|
---|
232 |
|
---|
233 | Return a tuple consisting of:
|
---|
234 | - the box
|
---|
235 | - the entry."""
|
---|
236 |
|
---|
237 | alignment = gtk.Alignment(xalign = 1.0, yalign = 0.5, xscale = 1.0)
|
---|
238 | alignment.set_padding(padding_top = 0, padding_bottom = 0,
|
---|
239 | padding_left = 0, padding_right = 16)
|
---|
240 | alignment.add(gtk.Label(label))
|
---|
241 |
|
---|
242 | entry = gtk.Entry()
|
---|
243 | entry.set_editable(False)
|
---|
244 | entry.set_width_chars(width)
|
---|
245 | entry.set_max_length(width)
|
---|
246 | entry.set_alignment(xalign)
|
---|
247 |
|
---|
248 | return (alignment, entry)
|
---|
249 |
|
---|
250 | def setData(self, aircraftState = None):
|
---|
251 | """Set the data.
|
---|
252 |
|
---|
253 | If aircraftState is None, everything will be set to its default."""
|
---|
254 | if aircraftState is None:
|
---|
255 | self._timestamp.set_text("--:--:--")
|
---|
256 | self._paused.set_sensitive(False)
|
---|
257 | self._trickMode.set_sensitive(False)
|
---|
258 | self._overspeed.set_sensitive(False)
|
---|
259 | self._stalled.set_sensitive(False)
|
---|
260 | self._onTheGround.set_sensitive(False)
|
---|
261 | self._zfw.set_text("-")
|
---|
262 | self._grossWeight.set_text("-")
|
---|
263 | self._heading.set_text("-")
|
---|
264 | self._pitch.set_text("-")
|
---|
265 | self._bank.set_text("-")
|
---|
266 | self._vs.set_text("-")
|
---|
267 | self._ias.set_text("-")
|
---|
268 | self._mach.set_text("-")
|
---|
269 | self._groundSpeed.set_text("-")
|
---|
270 | self._radioAltitude.set_text("-")
|
---|
271 | self._altitude.set_text("-")
|
---|
272 | self._gLoad.set_text("-")
|
---|
273 | self._flapsSet.set_text("-")
|
---|
274 | self._flaps.set_text("-")
|
---|
275 | self._altimeter.set_text("-")
|
---|
276 | self._squawk.set_text("-")
|
---|
277 | self._nav1.set_text("-")
|
---|
278 | self._nav2.set_text("-")
|
---|
279 | self._fuel.set_text("-")
|
---|
280 | self._n1.set_text("-")
|
---|
281 | self._reverser.set_text("-")
|
---|
282 | self._navLightsOn.set_sensitive(False)
|
---|
283 | self._antiCollisionLightsOn.set_sensitive(False)
|
---|
284 | self._strobeLightsOn.set_sensitive(False)
|
---|
285 | self._landingLightsOn.set_text("LANDING")
|
---|
286 | self._landingLightsOn.set_sensitive(False)
|
---|
287 | self._pitotHeatOn.set_sensitive(False)
|
---|
288 | self._parking.set_sensitive(False)
|
---|
289 | self._gearControlDown.set_sensitive(False)
|
---|
290 | self._gearsDown.set_sensitive(False)
|
---|
291 | self._spoilersArmed.set_sensitive(False)
|
---|
292 | self._spoilersExtension.set_text("-")
|
---|
293 | self._windSpeed.set_text("-")
|
---|
294 | self._windDirection.set_text("-")
|
---|
295 | self._position.set_text("-")
|
---|
296 | self._elevatorTrim.set_text("-")
|
---|
297 | self._apMaster.set_sensitive(False)
|
---|
298 | self._apHeadingHold.set_sensitive(False)
|
---|
299 | self._apHeading.set_text("-")
|
---|
300 | self._xpdrC.set_sensitive(False)
|
---|
301 | self._apAltitudeHold.set_sensitive(False)
|
---|
302 | self._apAltitude.set_text("-")
|
---|
303 | self._adf1.set_text("-")
|
---|
304 | self._adf2.set_text("-")
|
---|
305 | else:
|
---|
306 | self._timestamp.set_text(time.strftime("%H:%M:%S",
|
---|
307 | time.gmtime(aircraftState.timestamp)))
|
---|
308 | self._paused.set_sensitive(aircraftState.paused)
|
---|
309 | self._trickMode.set_sensitive(aircraftState.trickMode)
|
---|
310 | self._overspeed.set_sensitive(aircraftState.overspeed)
|
---|
311 | self._stalled.set_sensitive(aircraftState.stalled)
|
---|
312 | self._onTheGround.set_sensitive(aircraftState.onTheGround)
|
---|
313 | self._zfw.set_text("%.0f" % (aircraftState.zfw,))
|
---|
314 | self._grossWeight.set_text("%.0f" % (aircraftState.grossWeight,))
|
---|
315 | self._heading.set_text("%03.0f" % (aircraftState.heading,))
|
---|
316 | self._pitch.set_text("%.0f" % (aircraftState.pitch,))
|
---|
317 | self._bank.set_text("%.0f" % (aircraftState.bank,))
|
---|
318 | self._vs.set_text("%.0f (%.0f)" % (aircraftState.vs,
|
---|
319 | aircraftState.smoothedVS))
|
---|
320 | self._ias.set_text("%.0f (%.0f)" % (aircraftState.ias,
|
---|
321 | aircraftState.smoothedIAS))
|
---|
322 | self._mach.set_text("%.2f" % (aircraftState.mach,))
|
---|
323 | self._groundSpeed.set_text("%.0f" % (aircraftState.groundSpeed,))
|
---|
324 | self._radioAltitude.set_text("%.0f" % (aircraftState.radioAltitude,))
|
---|
325 | self._altitude.set_text("%.0f" % (aircraftState.altitude,))
|
---|
326 | self._gLoad.set_text("%.2f" % (aircraftState.gLoad,))
|
---|
327 | self._flapsSet.set_text("%.0f" % (aircraftState.flapsSet,))
|
---|
328 | self._flaps.set_text("%.0f" % (aircraftState.flaps,))
|
---|
329 | self._altimeter.set_text("%.0f" % (aircraftState.altimeter,))
|
---|
330 | self._squawk.set_text(aircraftState.squawk)
|
---|
331 | self._nav1.set_text("-" if aircraftState.nav1 is None else aircraftState.nav1)
|
---|
332 | self._nav2.set_text("-" if aircraftState.nav2 is None else aircraftState.nav2)
|
---|
333 |
|
---|
334 | fuelStr = ""
|
---|
335 | for (_tank, fuel) in aircraftState.fuel:
|
---|
336 | if fuelStr: fuelStr += ", "
|
---|
337 | fuelStr += "%.0f" % (fuel,)
|
---|
338 | self._fuel.set_text(fuelStr)
|
---|
339 |
|
---|
340 | if aircraftState.n1 is not None:
|
---|
341 | n1Str = ""
|
---|
342 | for n1 in aircraftState.n1:
|
---|
343 | if n1Str: n1Str += ", "
|
---|
344 | n1Str += "%.0f" % (n1,)
|
---|
345 | elif aircraftState.rpm is not None:
|
---|
346 | n1Str = ""
|
---|
347 | for rpm in aircraftState.rpm:
|
---|
348 | if n1Str: n1Str += ", "
|
---|
349 | n1Str += "%.0f" % (rpm,)
|
---|
350 | else:
|
---|
351 | n1Str = "-"
|
---|
352 | self._n1.set_text(n1Str)
|
---|
353 |
|
---|
354 | reverserStr = ""
|
---|
355 | for reverser in aircraftState.reverser:
|
---|
356 | if reverserStr: reverserStr += ", "
|
---|
357 | reverserStr += "ON" if reverser else "OFF"
|
---|
358 | self._reverser.set_text(reverserStr)
|
---|
359 |
|
---|
360 | self._navLightsOn.set_sensitive(aircraftState.navLightsOn)
|
---|
361 | self._antiCollisionLightsOn.set_sensitive(aircraftState.antiCollisionLightsOn)
|
---|
362 | self._strobeLightsOn.set_sensitive(aircraftState.strobeLightsOn)
|
---|
363 |
|
---|
364 | if self._previousState is None or \
|
---|
365 | ((self._previousState.landingLightsOn is None)!=
|
---|
366 | (aircraftState.landingLightsOn is None)):
|
---|
367 | if aircraftState.landingLightsOn is None:
|
---|
368 | self._landingLightsOn.set_markup('<span strikethrough="true">LANDING</span>')
|
---|
369 | else:
|
---|
370 | self._landingLightsOn.set_text("LANDING")
|
---|
371 | self._landingLightsOn.set_sensitive(aircraftState.landingLightsOn is True)
|
---|
372 |
|
---|
373 | self._pitotHeatOn.set_sensitive(aircraftState.pitotHeatOn)
|
---|
374 | self._parking.set_sensitive(aircraftState.parking)
|
---|
375 | self._gearControlDown.set_sensitive(aircraftState.gearControlDown)
|
---|
376 | self._gearsDown.set_sensitive(aircraftState.gearsDown)
|
---|
377 | self._spoilersArmed.set_sensitive(aircraftState.spoilersArmed)
|
---|
378 | self._spoilersExtension.set_text("%.0f" % (aircraftState.spoilersExtension,))
|
---|
379 | self._windSpeed.set_text("%.0f" % (aircraftState.windSpeed,))
|
---|
380 | self._windDirection.set_text("%03.0f" % (aircraftState.windDirection,))
|
---|
381 | self._position.set_text(util.getCoordinateString((aircraftState.latitude,
|
---|
382 | aircraftState.longitude)))
|
---|
383 | self._elevatorTrim.set_text("%.2f" % (aircraftState.elevatorTrim,))
|
---|
384 | self._apMaster.set_sensitive(aircraftState.apMaster)
|
---|
385 | self._apHeadingHold.set_sensitive(aircraftState.apHeadingHold)
|
---|
386 | self._apHeading.set_text("%03.0f" % (aircraftState.apHeading,))
|
---|
387 | self._xpdrC.set_sensitive(aircraftState.xpdrC)
|
---|
388 | self._apAltitudeHold.set_sensitive(aircraftState.apAltitudeHold)
|
---|
389 | self._apAltitude.set_text("%5.0f" % (aircraftState.apAltitude,))
|
---|
390 |
|
---|
391 | self._adf1.set_text("-" if aircraftState.adf1 is None else aircraftState.adf1)
|
---|
392 | self._adf2.set_text("-" if aircraftState.adf2 is None else aircraftState.adf2)
|
---|
393 |
|
---|
394 | #------------------------------------------------------------------------------
|
---|