Ignore:
Timestamp:
12/30/16 15:37:51 (7 years ago)
Author:
István Váradi <ivaradi@…>
Branch:
default
hg-Phase:
(<MercurialRepository 1 'hg:/home/ivaradi/mlx/hg' '/'>, 'public')
Message:

A PIREP can be queried from the server (re #307)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/mlx/pirep.py

    r778 r829  
    11
    22from util import utf2unicode
     3from flight import Flight
    34
    45import const
    56import cPickle as pickle
     7import calendar
    68import datetime
    79import time
     
    3638        """Format the given timestamp for RPC."""
    3739        return time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(t))
     40
     41    @staticmethod
     42    def parseTimestampFromRPC(s):
     43        """Format the given timestamp for RPC."""
     44        dt = datetime.datetime.strptime(s, "%Y-%m-%d %H:%M:%S")
     45        return calendar.timegm(dt.utctimetuple())
     46
     47    @staticmethod
     48    def decodeFlightTypeText(s):
     49        """Decode the given flight type text."""
     50        for (flighType, text) in PIREP._flightTypes.iteritems():
     51            if s==text:
     52                return flighType
     53        return const.FLIGHTYPE_SCHEDULED
     54
     55    @staticmethod
     56    def parseLogFromRPC(log):
     57        """Parse the given log coming from the RPC."""
     58        index = 0
     59        entries = []
     60
     61        inTimeStr = False
     62        inEntry = False
     63
     64        timestr = ""
     65        entry = ""
     66
     67        while index<len(log):
     68            c = log[index]
     69            index += 1
     70
     71            if c==']':
     72                if inEntry:
     73                    entries.append((timestr, entry))
     74                    timestr = ""
     75                    entry = ""
     76
     77                inTimeStr = False
     78                inEntry = False
     79            elif not inTimeStr and not inEntry:
     80                if c=='[':
     81                    if timestr:
     82                        inEntry = True
     83                    else:
     84                        inTimeStr = True
     85            elif inTimeStr:
     86                timestr += c
     87            elif inEntry:
     88                entry += c
     89
     90        return entries
    3891
    3992    @staticmethod
     
    61114    def __init__(self, flight):
    62115        """Initialize the PIREP from the given flight."""
     116        if flight is None:
     117            return
     118
    63119        self.bookedFlight = flight.bookedFlight
    64120
     
    102158        self.logLines = logger.lines
    103159        self.faultLineIndexes = logger.faultLineIndexes
     160
     161    def setupFromPIREPData(self, pirepData, bookedFlight):
     162
     163        self.bookedFlight = bookedFlight
     164
     165        self.numCrew = int(pirepData["numCrew"])
     166        self.numPassengers = int(pirepData["numPassengers"])
     167        self.bagWeight = int(pirepData["bagWeight"])
     168        self.cargoWeight = int(pirepData["cargoWeight"])
     169        self.mailWeight = int(pirepData["mailWeight"])
     170
     171        self.filedCruiseAltitude = int(pirepData["filedCruiseLevel"][2:])*100
     172        cruiseLevel = pirepData["cruiseLevel"]
     173        if cruiseLevel:
     174            self.cruiseAltitude = int(cruiseLevel[2:])*100
     175        else:
     176            self.cruiseAltitude = self.filedCruiseAltitude
     177        self.route = pirepData["route"]
     178
     179        self.departureMETAR = pirepData["departureMETAR"]
     180        self.arrivalMETAR = pirepData["arrivalMETAR"]
     181
     182        self.departureRunway = pirepData["departureRunway"]
     183        self.sid = pirepData["sid"]
     184
     185        star = pirepData["star"].split(",")
     186        self.star = star[0]
     187        self.star.strip()
     188
     189        if len(star)>1:
     190            self.transition = star[1]
     191            self.transition.strip()
     192        else:
     193            self.transition = ""
     194        self.approachType = pirepData["approachType"]
     195        self.arrivalRunway = pirepData["arrivalRunway"]
     196
     197        self.flightType = PIREP.decodeFlightTypeText(pirepData["flightType"])
     198        self.online = int(pirepData["online"])!=0
     199
     200        self.comments = pirepData["comments"]
     201        self.flightDefects = pirepData["flightDefects"]
     202        self.delayCodes = pirepData["timeComment"]
     203        if self.delayCodes=="UTC":
     204            self.delayCodes = ""
     205
     206        flightDate = pirepData["flightDate"] + " "
     207
     208        self.blockTimeStart = \
     209          PIREP.parseTimestampFromRPC(flightDate + pirepData["blockTimeStart"])
     210        self.flightTimeStart = \
     211          PIREP.parseTimestampFromRPC(flightDate + pirepData["flightTimeStart"])
     212        self.flightTimeEnd = \
     213          PIREP.parseTimestampFromRPC(flightDate + pirepData["flightTimeEnd"])
     214        self.blockTimeEnd = \
     215          PIREP.parseTimestampFromRPC(flightDate + pirepData["blockTimeEnd"])
     216        self.flownDistance = float(pirepData["flownDistance"])
     217        self.fuelUsed = float(pirepData["fuelUsed"])
     218
     219        # logger = flight.logger
     220        self.rating = float(pirepData["rating"])
     221
     222        log = pirepData["log"]
     223
     224        self.logLines = PIREP.parseLogFromRPC(log)[1:]
     225        if self.logLines and \
     226           (self.logLines[0][0]=="LOGGER NG LOG" or
     227            self.logLines[0][0]=="MAVA LOGGER X"):
     228            self.logLines = self.logLines[1:]
     229        numLogLines = len(self.logLines)
     230
     231        lastFaultLineIndex = 0
     232        self.faultLineIndexes = []
     233        for ratingText in pirepData["ratingText"].splitlines()[:-1]:
     234            faultLines = PIREP.parseLogFromRPC(ratingText)
     235            for (timeStr, entry) in faultLines:
     236                for i in range(lastFaultLineIndex, numLogLines-1):
     237                    if timeStr>=self.logLines[i][0] and \
     238                       timeStr<self.logLines[i+1][0]:
     239                        self.logLines = self.logLines[:i+1] + \
     240                          [(timeStr, entry)] + self.logLines[i+1:]
     241                        self.faultLineIndexes.append(i+1)
     242                        lastFaultLineIndex = i+1
     243                        numLogLines += 1
     244                        break
    104245
    105246    @property
Note: See TracChangeset for help on using the changeset viewer.