Changeset 443:acbe605bb814 for src/mlx


Ignore:
Timestamp:
02/28/13 18:56:30 (12 years ago)
Author:
István Váradi <ivaradi@…>
Branch:
default
Phase:
public
Message:

Added support for the BAe 146-200 aircraft type (re #182)

Location:
src/mlx
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • src/mlx/acft.py

    r409 r443  
    10171017#---------------------------------------------------------------------------------------
    10181018
     1019class B462(Aircraft):
     1020    """British Aerospace BAe-146 aircraft.
     1021
     1022    The aircraft type-specific values in the aircraft state have the following
     1023    structure:
     1024    - fuel: left, centre, right
     1025    - n1: left outer, left inner, right inner, right outer
     1026    - reverser: empty (the plane has no reversers)"""
     1027    def __init__(self, flight):
     1028        super(B462, self).__init__(flight)
     1029        self.dow = 25706
     1030        self.mtow = 43998
     1031        self.mlw = 38599
     1032        self.mzfw = 33792
     1033        self.gearSpeedLimit = 210
     1034        self.flapSpeedLimits = { 18 : 217,
     1035                                 24 : 180,
     1036                                 30 : 170,
     1037                                 33 : 150 }
     1038
     1039#---------------------------------------------------------------------------------------
     1040
    10191041mostFuelTanks = [const.FUELTANK_LEFT_TIP, const.FUELTANK_EXTERNAL1,
    10201042                 const.FUELTANK_LEFT_AUX,
     
    10401062             const.AIRCRAFT_T134  : T134,
    10411063             const.AIRCRAFT_T154  : T154,
    1042              const.AIRCRAFT_YK40  : YK40 }
     1064             const.AIRCRAFT_YK40  : YK40,
     1065             const.AIRCRAFT_B462  : B462 }
    10431066
    10441067#---------------------------------------------------------------------------------------
  • src/mlx/checks.py

    r416 r443  
    13041304        return flight.stage in [const.STAGE_DESCENT, const.STAGE_LANDING,
    13051305                                const.STAGE_TAXIAFTERLAND] and \
     1306            state.reverser and \
    13061307            state.groundSpeed<aircraft.reverseMinSpeed and max(state.reverser)
    13071308
  • src/mlx/const.py

    r437 r443  
    9595## Aircraft type: Yakovlev Yak-40
    9696AIRCRAFT_YK40 = 15
     97
     98## Aircraft type: British Aerospace BAe-146
     99AIRCRAFT_B462 = 16
    97100
    98101#-------------------------------------------------------------------------------
     
    108111                 AIRCRAFT_B733, AIRCRAFT_B734, AIRCRAFT_B735,
    109112                 AIRCRAFT_T154, AIRCRAFT_T134,
    110                  AIRCRAFT_YK40, AIRCRAFT_DC3]
     113                 AIRCRAFT_YK40, AIRCRAFT_DC3,
     114                 AIRCRAFT_B462]
    111115
    112116#-------------------------------------------------------------------------------
     
    129133              AIRCRAFT_T134  : "T134",
    130134              AIRCRAFT_T154  : "T154",
    131               AIRCRAFT_YK40  : "YK40" }
     135              AIRCRAFT_YK40  : "YK40",
     136              AIRCRAFT_B462  : "B462" }
    132137
    133138#-------------------------------------------------------------------------------
  • src/mlx/fsuipc.py

    r412 r443  
    20432043#------------------------------------------------------------------------------
    20442044
     2045class B462Model(GenericAircraftModel):
     2046    """Generic model for the British Aerospace BAe 146-200 aircraft."""
     2047    fuelTanks = [const.FUELTANK_LEFT, const.FUELTANK_CENTRE,
     2048                 const.FUELTANK_RIGHT]
     2049
     2050    def __init__(self):
     2051        """Construct the model."""
     2052        super(B462Model, self). \
     2053            __init__(flapsNotches = [0, 18, 24, 30, 33],
     2054                     fuelTanks = B462Model.fuelTanks,
     2055                     numEngines = 4)
     2056
     2057    @property
     2058    def name(self):
     2059        """Get the name for this aircraft model."""
     2060        return "FSUIPC/Generic British Aerospace 146"
     2061
     2062    def getAircraftState(self, aircraft, timestamp, data):
     2063        """Get an aircraft state object for the given monitoring data.
     2064
     2065        This removes the reverser value for the middle engine."""
     2066        state = super(B462Model, self).getAircraftState(aircraft, timestamp, data)
     2067        state.reverser = []
     2068        return state
     2069
     2070#------------------------------------------------------------------------------
     2071
    20452072_genericModels = { const.AIRCRAFT_B736  : B737Model,
    20462073                   const.AIRCRAFT_B737  : B737Model,
     
    20582085                   const.AIRCRAFT_T134  : T134Model,
    20592086                   const.AIRCRAFT_T154  : T154Model,
    2060                    const.AIRCRAFT_YK40  : YK40Model }
     2087                   const.AIRCRAFT_YK40  : YK40Model,
     2088                   const.AIRCRAFT_B462  : B462Model }
    20612089
    20622090#------------------------------------------------------------------------------
  • src/mlx/gui/common.py

    r438 r443  
    298298                  _const.AIRCRAFT_T134  : xstr("aircraft_t134"),
    299299                  _const.AIRCRAFT_T154  : xstr("aircraft_t154"),
    300                   _const.AIRCRAFT_YK40  : xstr("aircraft_yk40") }
     300                  _const.AIRCRAFT_YK40  : xstr("aircraft_yk40"),
     301                  _const.AIRCRAFT_B462  : xstr("aircraft_b462") }
    301302
    302303#------------------------------------------------------------------------------
  • src/mlx/pyuipc_sim.py

    r408 r443  
    158158    ENGINE_3 = 2
    159159
     160    ## Engine index: engine #4
     161    ENGINE_4 = 3
     162
    160163    ## The number of hotkey entries
    161164    HOTKEY_SIZE = 56
     
    295298        self.visibility = 10000
    296299
    297         self.n1 = [0.0, 0.0, 0.0]
    298         self.throttles = [0.0, 0.0, 0.0]
     300        self.n1 = [0.0, 0.0, 0.0, 0.0]
     301        self.throttles = [0.0, 0.0, 0.0, 0.0]
    299302
    300303        self.payloadCount = 1
     
    328331        self.eng2DeIce = False
    329332        self.eng3DeIce = False
     333        self.eng4DeIce = False
    330334        self.propDeIce = False
    331335        self.structDeIce = False
     
    427431        elif offset==0x09e2:       # Engine #3 de-ice
    428432            return 1 if self.eng3DeIce else 0
     433        elif offset==0x0a54:       # Engine #4 throttle
     434            return self._getThrottle(self.ENGINE_4)
     435        elif offset==0x0a7a:       # Engine #4 de-ice
     436            return 1 if self.eng4DeIce else 0
    429437        elif offset==0x0af4:       # Fuel weight
    430438            return int(self.fuelWeight * 256.0)
     
    533541            return self.n1[self.ENGINE_2]
    534542        elif offset==0x2200:       # Engine #3 N1
     543            return self.n1[self.ENGINE_3]
     544        elif offset==0x2300:       # Engine #4 N1
    535545            return self.n1[self.ENGINE_3]
    536546        elif offset==0x2ea0:       # Elevator trim
     
    695705        elif offset==0x09e2:       # Engine #3 de-ice
    696706            self.eng3DeIce = value!=0
     707        elif offset==0x0a54:       # Engine #4 throttle
     708            self._setThrottle(self.ENGINE_4, value)
     709        elif offset==0x0a7a:       # Engine #4 de-ice
     710            self.eng4DeIce = value!=0
    697711        elif offset==0x0af4:       # Fuel weight
    698712            self.fuelWeight = value / 256.0
     
    796810        elif offset==0x2200:       # Engine #3 N1
    797811            self.n1[self.ENGINE_3] = value
     812        elif offset==0x2300:       # Engine #4 N1
     813            self.n1[self.ENGINE_4] = value
    798814        elif offset==0x2ea0:       # Elevator trim
    799815            self.elevatorTrim = value * 180.0 / math.pi
     
    14131429        self._valueHandlers["n1_3"] = ([(0x2200, "f")], lambda value: value,
    14141430                                       lambda word: float(word))
     1431        self._valueHandlers["n1_4"] = ([(0x2300, "f")], lambda value: value,
     1432                                       lambda word: float(word))
    14151433
    14161434        self._valueHandlers["throttle_1"] = ([(0x088c, "H")],
     
    14211439                                             CLI.throttle2pyuipc)
    14221440        self._valueHandlers["throttle_3"] = ([(0x09bc, "H")],
     1441                                             CLI.pyuipc2throttle,
     1442                                             CLI.throttle2pyuipc)
     1443        self._valueHandlers["throttle_4"] = ([(0x0a54, "H")],
    14231444                                             CLI.pyuipc2throttle,
    14241445                                             CLI.throttle2pyuipc)
     
    14901511                                            CLI.bool2str, CLI.str2bool)
    14911512        self._valueHandlers["eng3Deice"] = ([(0x09e2, "H")],
     1513                                            CLI.bool2str, CLI.str2bool)
     1514        self._valueHandlers["eng4Deice"] = ([(0x0a7a, "H")],
    14921515                                            CLI.bool2str, CLI.str2bool)
    14931516        self._valueHandlers["propDeice"] = ([(0x337c, "b")],
  • src/mlx/web.py

    r401 r443  
    6363                      "TU3"  : const.AIRCRAFT_T134,
    6464                      "TU5"  : const.AIRCRAFT_T154,
    65                       "YK4"  : const.AIRCRAFT_YK40 }
     65                      "YK4"  : const.AIRCRAFT_YK40,
     66                      "146"  : const.AIRCRAFT_B462 }
    6667
    6768    TYPE2TYPECODE = { const.AIRCRAFT_B736  : "736",
     
    8081                      const.AIRCRAFT_T134  : "TU3",
    8182                      const.AIRCRAFT_T154  : "TU5",
    82                       const.AIRCRAFT_YK40  : "YK4" }
     83                      const.AIRCRAFT_YK40  : "YK4",
     84                      const.AIRCRAFT_B462  : "146" }
    8385
    8486    @staticmethod
     
    115117        departureTime = readline(f)
    116118        self.departureTime = BookedFlight.getDateTime(date, departureTime)
    117                                                
     119
    118120        arrivalTime = readline(f)
    119121        self.arrivalTime = BookedFlight.getDateTime(date, arrivalTime)
     
    130132        departureTime = None
    131133        arrivalTime = None
    132        
     134
    133135        line = f.readline()
    134         lineNumber = 0   
     136        lineNumber = 0
    135137        while line:
    136138            lineNumber += 1
    137139            line = line.strip()
    138            
     140
    139141            hashIndex = line.find("#")
    140142            if hashIndex>=0: line = line[:hashIndex]
     
    142144                equalIndex = line.find("=")
    143145                lineOK = equalIndex>0
    144                
     146
    145147                if lineOK:
    146                     key = line[:equalIndex].strip()                   
     148                    key = line[:equalIndex].strip()
    147149                    value = line[equalIndex+1:].strip().replace("\:", ":")
    148                    
     150
    149151                    lineOK = key and value
    150152
     
    196198            self.aircraftTypeName = \
    197199                BookedFlight.TYPE2TYPECODE[self.aircraftType]
    198            
     200
    199201    def writeIntoFile(self, f):
    200202        """Write the flight into a file."""
     
    235237        else:
    236238            raise Exception("Invalid aircraft type code: '" + typeCode + "'")
    237        
     239
    238240    def __repr__(self):
    239241        """Get a representation of the flight."""
     
    248250        s += ">"
    249251        return s
    250        
     252
    251253#------------------------------------------------------------------------------
    252254
     
    279281    def __repr__(self):
    280282        """Get the representation of the plane object."""
    281         s = "<Plane: %s %s" % (self.tailNumber, 
     283        s = "<Plane: %s %s" % (self.tailNumber,
    282284                               "home" if self.status==const.PLANE_HOME else \
    283285                               "away" if self.status==const.PLANE_AWAY else \
     
    288290        s += ">"
    289291        return s
    290        
     292
    291293
    292294#------------------------------------------------------------------------------
     
    323325                gateNumbers.add(p.gateNumber)
    324326        return gateNumbers
    325    
     327
    326328    def updatePlane(self, tailNumber, status, gateNumber = None):
    327329        """Update the status of the given plane."""
     
    330332            plane.status = status
    331333            plane.gateNumber = gateNumber
    332    
     334
    333335    def __iter__(self):
    334336        """Get an iterator over the planes."""
    335337        for plane in self._planes.itervalues():
    336338            yield plane
    337        
     339
    338340    def __getitem__(self, tailNumber):
    339341        """Get the plane with the given tail number.
     
    345347        """Get the representation of the fleet object."""
    346348        return self._planes.__repr__()
    347        
     349
    348350#------------------------------------------------------------------------------
    349351
     
    371373        s += ">"
    372374        return s
    373    
     375
    374376#------------------------------------------------------------------------------
    375377
     
    389391           "E" not in attrs or not attrs["E"]:
    390392            return
    391        
     393
    392394        icao = attrs["A"]
    393395        if icao not in self._notams:
    394396            return
    395        
     397
    396398        begin = datetime.datetime.strptime(attrs["B"], "%Y-%m-%d %H:%M:%S")
    397399
    398400        c = attrs["C"] if "C" in attrs else None
    399401        end = datetime.datetime.strptime(c, "%Y-%m-%d %H:%M:%S") if c else None
    400        
     402
    401403        permanent = attrs["C_flag"]=="PERM" if "C_flag" in attrs else False
    402        
     404
    403405        repeatCycle = attrs["D"] if "D" in attrs else None
    404406
     
    473475    """A login request."""
    474476    iso88592decoder = codecs.getdecoder("iso-8859-2")
    475    
     477
    476478    def __init__(self, callback, pilotID, password, entranceExam):
    477479        """Construct the login request with the given pilot ID and
     
    488490        md5.update(self._pilotID)
    489491        pilotID = md5.hexdigest()
    490        
     492
    491493        md5 = hashlib.md5()
    492494        md5.update(self._password)
     
    524526                result.pilotName = self.iso88592decoder(readline(f))[0]
    525527                result.exams = readline(f)
    526                
     528
    527529                while True:
    528530                    line = readline(f)
     
    540542
    541543        return result
    542        
     544
    543545#------------------------------------------------------------------------------
    544546
    545547class GetFleet(Request):
    546548    """Request to get the fleet from the website."""
    547    
     549
    548550    def __init__(self, callback):
    549551        """Construct the fleet request."""
     
    558560        result.fleet = Fleet(f)
    559561        f.close()
    560        
     562
    561563        return result
    562564
     
    585587                                 ("status", status),
    586588                                 ("kapu", gateNumber)])
    587        
     589
    588590        f = urllib2.urlopen(url, data, timeout = 10.0)
    589591        line = readline(f)
    590        
     592
    591593        result = Result()
    592594        result.success = line == "OK"
    593595
    594596        return result
    595            
     597
    596598#------------------------------------------------------------------------------
    597599
     
    628630
    629631class GetMETARs(Request):
    630     """Get the METARs from the NOAA website for certain airport ICAOs."""   
     632    """Get the METARs from the NOAA website for certain airport ICAOs."""
    631633
    632634    def __init__(self, callback, airports):
     
    639641        url = "http://www.aviationweather.gov/adds/dataserver_current/httpparam?"
    640642        data = urllib.urlencode([ ("dataSource" , "metars"),
    641                                   ("requestType",  "retrieve"), 
     643                                  ("requestType",  "retrieve"),
    642644                                  ("format", "csv"),
    643645                                  ("stationString", " ".join(self._airports)),
     
    652654                if len(line)>5 and line[4]==' ':
    653655                    icao = line[0:4]
    654                     if icao in self._airports:                       
     656                    if icao in self._airports:
    655657                        result.metars[icao] = line.strip().split(",")[0]
    656658        finally:
     
    696698        data["bag"] = str(pirep.bagWeight)
    697699        data["mail"] = str(pirep.mailWeight)
    698        
     700
    699701        data["flttype"] = SendPIREP._flightTypes[pirep.flightType]
    700702        data["onoff"] = "1" if pirep.online else "0"
     
    742744            f.close()
    743745
    744         return result   
     746        return result
    745747#------------------------------------------------------------------------------
    746748
     
    757759        """Perform the sending of the ACARS."""
    758760        print "Sending the online ACARS"
    759        
     761
    760762        url = "http://www.virtualairlines.hu/acars2/acarsonline.php"
    761763
     
    766768        data["pid"] = acars.pid
    767769        data["pilot"] = SendACARS._latin2Encoder(acars.pilotName)[0]
    768    
     770
    769771        data["pass"] = str(bookedFlight.numPassengers)
    770772        data["callsign"] = bookedFlight.callsign
    771773        data["airplane"] = bookedFlight.aircraftTypeName
    772774        data["from"] = bookedFlight.departureICAO
    773         data["to"] = bookedFlight.arrivalICAO       
     775        data["to"] = bookedFlight.arrivalICAO
    774776        data["lajstrom"] = bookedFlight.tailNumber
    775777
     
    779781        data["altitude"] = str(acars.state.altitude)
    780782        data["speed"] = str(acars.state.groundSpeed)
    781        
     783
    782784        data["event"] = acars.getEventText()
    783785
     
    788790            f.close()
    789791
    790         return result   
     792        return result
    791793
    792794#------------------------------------------------------------------------------
     
    813815        """Enqueue a fleet retrieval request."""
    814816        self._addRequest(GetFleet(callback))
    815        
     817
    816818    def updatePlane(self, callback, tailNumber, status, gateNumber = None):
    817         """Update the status of the given plane."""       
     819        """Update the status of the given plane."""
    818820        self._addRequest(UpdatePlane(callback, tailNumber, status, gateNumber))
    819821
     
    821823        """Get the NOTAMs for the given two airports."""
    822824        self._addRequest(GetNOTAMs(callback, departureICAO, arrivalICAO))
    823        
     825
    824826    def getMETARs(self, callback, airports):
    825827        """Get the METARs for the given airports."""
     
    833835        """Send the given ACARS"""
    834836        self._addRequest(SendACARS(callback, acars))
    835        
     837
    836838    def run(self):
    837839        """Process the requests."""
     
    844846
    845847            request.perform()
    846    
     848
    847849    def _addRequest(self, request):
    848850        """Add the given request to the queue."""
     
    855857if __name__ == "__main__":
    856858    import time
    857    
     859
    858860    def callback(returned, result):
    859861        print returned, unicode(result)
    860        
     862
    861863    handler = Handler()
    862864    handler.start()
     
    866868    # Plane: HA-LEG home (gate 67)
    867869    #handler.updatePlane(callback, "HA-LQC", const.PLANE_AWAY, "72")
    868     #time.sleep(3)   
     870    #time.sleep(3)
    869871    #handler.getFleet(callback)
    870872    #time.sleep(3)
     
    873875    #handler.getMETARs(callback, ["LHBP", "EPWA"])
    874876    #time.sleep(5)
    875    
     877
    876878    handler.updatePlane(callback, "HA-LON", const.PLANE_AWAY, "")
    877     time.sleep(3)   
    878 
    879 #------------------------------------------------------------------------------
     879    time.sleep(3)
     880
     881#------------------------------------------------------------------------------
Note: See TracChangeset for help on using the changeset viewer.