source: src/mlx/logger.py@ 30:b8f08115af4c

Last change on this file since 30:b8f08115af4c was 30:b8f08115af4c, checked in by István Váradi <ivaradi@…>, 12 years ago

Fault messages are routed through the Flight object

File size: 3.6 KB
Line 
1# Module for the logging.
2
3#--------------------------------------------------------------------------------------
4
5import const
6
7import sys
8import time
9
10#--------------------------------------------------------------------------------------
11
12class Logger(object):
13 """The class with the interface to log the various events."""
14 # FIXME: shall we use const.stage2string() instead?
15 _stages = { const.STAGE_BOARDING : "Boarding",
16 const.STAGE_PUSHANDTAXI : "Pushback and Taxi",
17 const.STAGE_TAKEOFF : "Takeoff",
18 const.STAGE_RTO : "RTO",
19 const.STAGE_CLIMB : "Climb",
20 const.STAGE_CRUISE : "Cruise",
21 const.STAGE_DESCENT : "Descent",
22 const.STAGE_LANDING : "Landing",
23 const.STAGE_TAXIAFTERLAND : "Taxi",
24 const.STAGE_PARKING : "Parking",
25 const.STAGE_GOAROUND : "Go-Around",
26 const.STAGE_END : "End" }
27
28 NO_GO_SCORE = 10000
29
30 def __init__(self, output = sys.stdout):
31 """Construct the logger."""
32 self._faults = {}
33 self._output = output
34
35 @staticmethod
36 def _getTimeStr(timestamp):
37 """Get the string representation of the given timestamp."""
38 return time.strftime("%H:%M:%S", time.gmtime(timestamp))
39
40 def reset(self):
41 """Reset the logger.
42
43 The faults logged so far will be cleared."""
44 self._faults.clear()
45
46 def message(self, timestamp, msg):
47 """Put a simple textual message into the log with the given timestamp."""
48 timeStr = Logger._getTimeStr(timestamp)
49 print >> self._output, timeStr + ":", msg
50 print timeStr + ":", msg
51
52 def untimedMessage(self, msg):
53 """Put an untimed message into the log."""
54 print >> self._output, msg
55 print msg
56
57 def debug(self, msg):
58 """Log a debug message."""
59 print >> self._output, "[DEBUG]", msg
60 print "[DEBUG]", msg
61
62 def stage(self, timestamp, stage):
63 """Report a change in the flight stage."""
64 s = Logger._stages[stage] if stage in Logger._stages else "<Unknown>"
65 self.message(timestamp, "--- %s ---" % (s,))
66 if stage==const.STAGE_END:
67 totalScore = 100
68 for (id, score) in self._faults.iteritems():
69 totalScore -= score
70 self.untimedMessage("Score: %.0f" % (totalScore,))
71
72 def fault(self, faultID, timestamp, what, score):
73 """Report a fault.
74
75 faultID as a unique ID for the given kind of fault. If another fault of
76 this ID has been reported earlier, it will be reported again only if
77 the score is greater than last time. This ID can be, e.g. the checker
78 the report comes from."""
79 if faultID in self._faults:
80 if score<=self._faults[faultID]:
81 return
82 self._faults[faultID] = score
83 if score==Logger.NO_GO_SCORE:
84 self.message(timestamp, "%s (NO GO)" % (what))
85 else:
86 self.message(timestamp, "%s (%.1f)" % (what, score))
87
88 def noGo(self, faultID, timestamp, what):
89 """Report a No-Go fault."""
90 self.fault(faultID, timestamp, what, Logger.NO_GO_SCORE)
91
92 def getScore(self):
93 """Get the score of the flight so far."""
94 totalScore = 100
95 for (id, score) in self._faults.iteritems():
96 if score==Logger.NO_GO_SCORE:
97 return -score
98 else:
99 totalScore -= score
100 return totalScore
101
102#--------------------------------------------------------------------------------------
Note: See TracBrowser for help on using the repository browser.