Changeset 349:41c486c8a0b4 for src/mlx
- Timestamp:
- 12/10/12 19:28:32 (12 years ago)
- Branch:
- default
- Phase:
- public
- Location:
- src/mlx
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
src/mlx/acft.py
r345 r349 137 137 self._checkers.append(checks.PayloadChecker()) 138 138 139 self._checkers.append(checks.SpeedChecker())140 #self._checkers.append(checks.NoStrobeSpeedChecker())139 #self._checkers.append(checks.SpeedChecker()) 140 self._checkers.append(checks.NoStrobeSpeedChecker()) 141 141 self._checkers.append(checks.VSChecker()) 142 142 -
src/mlx/checks.py
r346 r349 1285 1285 """Check if the speed is in the prescribed limits.""" 1286 1286 @staticmethod 1287 def logSpeedFault(flight, state ):1287 def logSpeedFault(flight, state, stage = None, updateID = None): 1288 1288 """Log the speed fault.""" 1289 1289 message = "Taxi speed over %.0f %s" % \ 1290 1290 (flight.speedFromKnots(50), flight.getEnglishSpeedUnit()) 1291 flight.handleFault((SpeedChecker, flight.stage), state.timestamp, 1292 FaultChecker._appendDuring(flight, message), 1293 FaultChecker._getLinearScore(50, 80, 10, 15, 1294 state.groundSpeed), 1295 updatePrevious = True) 1291 if stage is None: 1292 stage = flight.stage 1293 score = FaultChecker._getLinearScore(50, 80, 10, 15, state.groundSpeed) 1294 return flight.handleFault((SpeedChecker, stage), state.timestamp, 1295 FaultChecker._appendDuring(flight, message), 1296 score, updatePrevious = updateID is None, 1297 updateID = updateID) 1296 1298 1297 1299 def isCondition(self, flight, aircraft, oldState, state): … … 1314 1316 saved as a provisional takeoff state. If the speed then decreases below 50 1315 1317 knots, or the plane remains on the ground for more than 20 seconds, a taxi 1316 speed error is logged with the highest ground speed detected. 1318 speed error is logged with the highest ground speed detected. This state is 1319 also stored in the flight object as a possible 1317 1320 1318 1321 If the plane becomes airborne within 20 seconds, the stage becomes TAKEOFF, … … 1345 1348 1346 1349 if state.timestamp > (self._takeoffState.timestamp + 20): 1347 SpeedChecker.logSpeedFault(flight,self._highestSpeedState)1350 flight.setRTOState(self._highestSpeedState) 1348 1351 elif not state.onTheGround: 1349 1352 aircraft.setStage(self._takeoffState, const.STAGE_TAKEOFF) 1350 1353 self._takeoffState = None 1351 1354 elif self._takeoffState is not None: 1352 SpeedChecker.logSpeedFault(flight,self._highestSpeedState)1355 flight.setRTOState(self._highestSpeedState) 1353 1356 self._takeoffState = None 1354 1357 -
src/mlx/flight.py
r348 r349 1 1 2 2 from soundsched import SoundScheduler, ChecklistScheduler 3 from checks import SpeedChecker 3 4 4 5 import const … … 45 46 self.blockTimeEnd = None 46 47 48 self._rtoState = None 49 self._rtoLogEntryID = None 50 47 51 self._lastDistanceTime = None 48 52 self._previousLatitude = None … … 229 233 return self.aircraft.speedInKnots if self.aircraft is not None \ 230 234 else True 235 236 @property 237 def hasRTO(self): 238 """Determine if we have an RTO state.""" 239 return self._rtoState is not None 240 241 @property 242 def rtoState(self): 243 """Get the RTO state.""" 244 return self._rtoState 231 245 232 246 def handleState(self, oldState, currentState): … … 270 284 271 285 def handleFault(self, faultID, timestamp, what, score, 272 updatePrevious = False ):286 updatePrevious = False, updateID = None): 273 287 """Handle the given fault. 274 288 … … 277 291 the score is greater than last time. This ID can be, e.g. the checker 278 292 the report comes from.""" 279 self.logger.fault(faultID, timestamp, what, score, 280 updatePrevious = updatePrevious) 293 id = self.logger.fault(faultID, timestamp, what, score, 294 updatePrevious = updatePrevious, 295 updateID = updateID) 281 296 self._gui.setRating(self.logger.getRating()) 297 return id 282 298 283 299 def handleNoGo(self, faultID, timestamp, what, shortReason): … … 285 301 self.logger.noGo(faultID, timestamp, what) 286 302 self._gui.setNoGo(shortReason) 303 304 def setRTOState(self, state): 305 """Set the state that might be used as the RTO state. 306 307 If there has been no RTO state, the GUI is notified that from now on 308 the user may select to report an RTO.""" 309 hadNoRTOState = self._rtoState is None 310 311 self._rtoState = state 312 self._rtoLogEntryID = \ 313 SpeedChecker.logSpeedFault(self, state, 314 stage = const.STAGE_PUSHANDTAXI) 315 316 if hadNoRTOState: 317 self._gui.updateRTO() 318 319 def rtoToggled(self, indicated): 320 """Called when the user has toggled the RTO indication.""" 321 if self._rtoState is not None: 322 if indicated: 323 self.logger.clearFault(self._rtoLogEntryID, 324 "RTO at %d knots" % 325 (self._rtoState.groundSpeed,)) 326 self._gui.setRating(self.logger.getRating()) 327 else: 328 SpeedChecker.logSpeedFault(self, self._rtoState, 329 stage = const.STAGE_PUSHANDTAXI, 330 updateID = self._rtoLogEntryID) 287 331 288 332 def flareStarted(self, flareStart, flareStartFS): -
src/mlx/gui/flight.py
r347 r349 2007 2007 xscale = 0.0, yscale = 0.0) 2008 2008 2009 table = gtk.Table( 5, 4)2009 table = gtk.Table(6, 4) 2010 2010 table.set_row_spacings(4) 2011 2011 table.set_col_spacings(16) … … 2086 2086 table.attach(self._v2Unit, 3, 4, 4, 5) 2087 2087 2088 self._rto = gtk.CheckButton(xstr("takeoff_rto")) 2089 self._rto.set_use_underline(True) 2090 self._rto.set_tooltip_text(xstr("takeoff_rto_tooltip")) 2091 self._rto.connect("toggled", self._rtoToggled) 2092 table.attach(self._rto, 2, 4, 5, 6, ypadding = 8) 2093 2088 2094 self.addCancelFlightButton() 2089 2095 … … 2116 2122 """Get the v2 speed.""" 2117 2123 return self._v2.get_int() 2124 2125 @property 2126 def rtoIndicated(self): 2127 """Get whether the pilot has indicated if there was an RTO.""" 2128 return self._rto.get_active() 2118 2129 2119 2130 def activate(self): … … 2140 2151 self._v2.set_tooltip_markup(xstr("takeoff_v2_tooltip" + i18nSpeedUnit)) 2141 2152 2153 self._rto.set_active(False) 2154 self._rto.set_sensitive(False) 2155 2142 2156 self._button.set_sensitive(False) 2143 2157 self._forwardAllowed = False … … 2154 2168 self._vr.reset() 2155 2169 self._v2.reset() 2170 2171 def setRTOEnabled(self, enabled): 2172 """Set the RTO checkbox enabled or disabled.""" 2173 if not enabled: 2174 self._rto.set_active(False) 2175 self._rto.set_sensitive(enabled) 2156 2176 2157 2177 def _updateForwardButton(self): … … 2176 2196 entry.set_text(entry.get_text().upper()) 2177 2197 self._valueChanged(entry, arg) 2198 2199 def _rtoToggled(self, button): 2200 """Called when the RTO check button is toggled.""" 2201 self._wizard.rtoToggled(button.get_active()) 2178 2202 2179 2203 def _backClicked(self, button): … … 2971 2995 """Get the V2 speed.""" 2972 2996 return self._takeoffPage.v2 2997 2998 @property 2999 def rtoIndicated(self): 3000 """Get whether the pilot has indicated that an RTO has occured.""" 3001 return self._takeoffPage.rtoIndicated 2973 3002 2974 3003 @property … … 3162 3191 callback = callback) 3163 3192 3193 def updateRTO(self): 3194 """Update the RTO state. 3195 3196 The RTO checkbox will be enabled if the flight has an RTO state and the 3197 comments field contains some text.""" 3198 flight = self.gui.flight 3199 rtoEnabled = flight is not None and flight.hasRTO and \ 3200 self.gui.hasComments 3201 self._takeoffPage.setRTOEnabled(rtoEnabled) 3202 3203 def rtoToggled(self, indicated): 3204 """Called when the RTO indication has changed.""" 3205 self.gui.rtoToggled(indicated) 3206 3164 3207 def _connectSimulator(self): 3165 3208 """Connect to the simulator.""" … … 3179 3222 3180 3223 #----------------------------------------------------------------------------- 3181 -
src/mlx/gui/gui.py
r345 r349 303 303 304 304 @property 305 def rtoIndicated(self): 306 """Get whether the pilot has indicated than an RTO has occured.""" 307 return self._wizard.rtoIndicated 308 309 @property 305 310 def arrivalRunway(self): 306 311 """Get the arrival runway.""" … … 341 346 """Get the comments.""" 342 347 return self._flightInfo.comments 348 349 @property 350 def hasComments(self): 351 """Indicate whether there is a comment.""" 352 return self._flightInfo.hasComments 343 353 344 354 @property … … 728 738 else: 729 739 callback(self._fleet) 740 741 def updateRTO(self, inLoop = False): 742 """Indicate that the RTO state should be updated.""" 743 if inLoop: 744 self._wizard.updateRTO() 745 else: 746 gobject.idle_add(self.updateRTO, True) 747 748 def rtoToggled(self, indicated): 749 """Called when the user has toggled the RTO checkbox.""" 750 self._flight.rtoToggled(indicated) 730 751 731 752 def _fleetResultCallback(self, returned, result): -
src/mlx/gui/info.py
r300 r349 33 33 (const.DELAYCODE_WEATHER, xstr("info_delay_weather")), 34 34 (const.DELAYCODE_PERSONAL, xstr("info_delay_personal")) ] 35 35 36 36 @staticmethod 37 37 def _createCommentArea(label): … … 50 50 alignment.set_padding(padding_top = 4, padding_bottom = 4, 51 51 padding_left = 8, padding_right = 8) 52 52 53 53 scroller = gtk.ScrolledWindow() 54 54 # FIXME: these should be constants … … 80 80 (frame, self._comments) = FlightInfo._createCommentArea(xstr("info_comments")) 81 81 commentsBox.pack_start(frame, True, True, 8) 82 self._comments.get_buffer().connect("changed", self._commentsChanged) 82 83 83 84 (frame, self._flightDefects) = \ … … 130 131 return text2unicode(buffer.get_text(buffer.get_start_iter(), 131 132 buffer.get_end_iter(), True)) 132 133 134 @property 135 def hasComments(self): 136 """Get whether there is any text in comments field.""" 137 return self._comments.get_buffer().get_char_count()>0 138 133 139 @property 134 140 def flightDefects(self): … … 147 153 codes.append(delayCodes[index][0]) 148 154 return codes 149 155 150 156 def enable(self): 151 157 """Enable the flight info tab.""" … … 153 159 self._flightDefects.set_sensitive(True) 154 160 self._delayTable.set_sensitive(True) 155 161 156 162 def disable(self): 157 163 """Enable the flight info tab.""" … … 167 173 for widget in self._delayCodeWidgets: 168 174 widget.set_active(False) 175 176 def _commentsChanged(self, textbuffer): 177 """Called when the comments have changed.""" 178 self._gui.updateRTO(inLoop = True) -
src/mlx/logger.py
r346 r349 97 97 98 98 def copy(self, timestamp = None, clearTimestamp = False, text = None, 99 fault Score = None):99 faultID = None, faultScore = None, clearFault = False): 100 100 """Create a copy of this entry with the given values changed.""" 101 assert faultScore is None or self._faultID is not None102 103 101 return Logger.Entry(None if clearTimestamp 104 102 else self._timestamp if timestamp is None … … 109 107 showTimestamp = self._showTimestamp, 110 108 111 faultID = self._faultID, 109 faultID = 110 None if clearFault 111 else self._faultID if faultID is None 112 else faultID, 112 113 113 114 faultScore = 114 self._faultScore if faultScore is None 115 None if clearFault 116 else self._faultScore if faultScore is None 115 117 else faultScore, 116 118 … … 248 250 249 251 def fault(self, faultID, timestamp, what, score, 250 updatePrevious = False ):252 updatePrevious = False, updateID = None): 251 253 """Report a fault. 252 254 … … 262 264 and the new score is not greater than the latest one, the ID of the 263 265 latest one is returned. 266 267 If updateID is given, the log entry with the given ID will be 268 'upgraded' to be a fault with the given data. 264 269 265 270 Returns an ID of the fault, or -1 if it was not logged.""" … … 279 284 faultScore = score) 280 285 self._updateEntry(id, newEntry) 286 elif updateID is not None: 287 id = updateID 288 newEntry = self._entries[id].copy(timestamp = timestamp, 289 text = text, faultID = faultID, 290 faultScore = score) 291 self._updateEntry(id, newEntry) 281 292 else: 282 293 id = self._addEntry(Logger.Entry(timestamp, text, faultID = faultID, 283 294 faultScore = score)) 284 295 285 (messageType, duration) = (const.MESSAGETYPE_NOGO, 10) \ 286 if score==Logger.NO_GO_SCORE \ 287 else (const.MESSAGETYPE_FAULT, 5) 288 sendMessage(messageType, text, duration) 296 if updateID is None: 297 (messageType, duration) = (const.MESSAGETYPE_NOGO, 10) \ 298 if score==Logger.NO_GO_SCORE \ 299 else (const.MESSAGETYPE_FAULT, 5) 300 sendMessage(messageType, text, duration) 289 301 290 302 return id … … 311 323 self._updateEntry(id, self._entries[id].copy(text = line)) 312 324 325 def clearFault(self, id, text): 326 """Update the line with the given ID to contain the given string, 327 and clear its fault state.""" 328 newEntry = self._entries[id].copy(text = text, clearFault = True) 329 self._updateEntry(id, newEntry) 330 313 331 def _addEntry(self, entry): 314 332 """Add the given entry to the log.
Note:
See TracChangeset
for help on using the changeset viewer.