Changeset 7:f8d6fda3c66d


Ignore:
Timestamp:
02/01/12 16:48:49 (13 years ago)
Author:
István Váradi <ivaradi@…>
Branch:
default
Phase:
public
Message:

Added the different type-specific aircraft classes and the type-specific generic FSUIPC-based models

Files:
4 edited

Legend:

Unmodified
Added
Removed
  • TODO

    r2 r7  
     1- Check how piston engines report RPM
  • src/acft.py

    r5 r7  
    44
    55import time
     6
     7import const
    68
    79#---------------------------------------------------------------------------------------
     
    163165                (timeStr, aircraftState.nav2)
    164166
     167        if self._aircraftState is None or \
     168           self._aircraftState.fuel != aircraftState.fuel:
     169            print "Aircraft.handleState: %s: fuel=%s" % \
     170                (timeStr, aircraftState.fuel)
     171
     172        if self._aircraftState is None or \
     173           self._aircraftState.n1 != aircraftState.n1:
     174            print "Aircraft.handleState: %s: n1=%s" % \
     175                (timeStr, aircraftState.n1)
     176
     177        if self._aircraftState is None or \
     178           self._aircraftState.reverser != aircraftState.reverser:
     179            print "Aircraft.handleState: %s: reverser=%s" % \
     180                (timeStr, aircraftState.reverser)
     181
    165182        self._aircraftState = aircraftState
    166183           
    167184#---------------------------------------------------------------------------------------
    168            
     185
     186class Boeing737(Aircraft):
     187    """Base class for the various aircraft in the Boeing 737 family.
     188
     189    The aircraft type-specific values in the aircraft state have the following
     190    structure:
     191    - fuel: centre, left, right
     192    - n1: left, right
     193    - reverser: left, right"""
     194    pass
     195
     196#---------------------------------------------------------------------------------------
     197
     198class B736(Boeing737):
     199    """Boeing 737-600 aircraft."""
     200    def __init__(self):
     201        super(B736, self).__init__(const.AIRCRAFT_B736)
     202
     203#---------------------------------------------------------------------------------------
     204
     205class B737(Boeing737):
     206    """Boeing 737-700 aircraft."""
     207    def __init__(self):
     208        super(B737, self).__init__(const.AIRCRAFT_B737)
     209
     210#---------------------------------------------------------------------------------------
     211
     212class B738(Boeing737):
     213    """Boeing 737-800 aircraft."""
     214    def __init__(self):
     215        super(B738, self).__init__(const.AIRCRAFT_B738)
     216
     217#---------------------------------------------------------------------------------------
     218
     219class B733(Boeing737):
     220    """Boeing 737-300 aircraft."""
     221    def __init__(self):
     222        super(B733, self).__init__(const.AIRCRAFT_B733)
     223
     224#---------------------------------------------------------------------------------------
     225
     226class B734(Boeing737):
     227    """Boeing 737-400 aircraft."""
     228    def __init__(self):
     229        super(B734, self).__init__(const.AIRCRAFT_B734)
     230
     231#---------------------------------------------------------------------------------------
     232
     233class B735(Boeing737):
     234    """Boeing 737-500 aircraft."""
     235    def __init__(self):
     236        super(B735, self).__init__(const.AIRCRAFT_B735)
     237
     238#---------------------------------------------------------------------------------------
     239
     240class DH8D(Aircraft):
     241    """Bombardier Dash-8 Q400 aircraft.
     242
     243    The aircraft type-specific values in the aircraft state have the following
     244    structure:
     245    - fuel: centre, left, right
     246    - n1: left, right
     247    - reverser: left, right."""
     248    def __init__(self):
     249        super(DH8D, self).__init__(const.AIRCRAFT_DH8D)
     250
     251#---------------------------------------------------------------------------------------
     252
     253class Boeing767(Aircraft):
     254    """Base class for the various aircraft in the Boeing 767 family.
     255
     256    The aircraft type-specific values in the aircraft state have the following
     257    structure:
     258    - fuel: centre, left, right
     259    - n1: left, right
     260    - reverser: left, right"""
     261
     262#---------------------------------------------------------------------------------------
     263
     264class B762(Boeing767):
     265    """Boeing 767-200 aircraft."""
     266    def __init__(self):
     267        super(B762, self).__init__(const.AIRCRAFT_B762)
     268
     269#---------------------------------------------------------------------------------------
     270
     271class B763(Boeing767):
     272    """Boeing 767-300 aircraft."""
     273    def __init__(self):
     274        super(B763, self).__init__(const.AIRCRAFT_B763)
     275
     276#---------------------------------------------------------------------------------------
     277
     278class CRJ2(Aircraft):
     279    """Bombardier CRJ-200 aircraft.
     280
     281    The aircraft type-specific values in the aircraft state have the following
     282    structure:
     283    - fuel: centre, left, right
     284    - n1: left, right
     285    - reverser: left, right."""
     286    def __init__(self):
     287        super(CRJ2, self).__init__(const.AIRCRAFT_CRJ2)
     288
     289#---------------------------------------------------------------------------------------
     290
     291class F70(Aircraft):
     292    """Fokker 70 aircraft.
     293
     294    The aircraft type-specific values in the aircraft state have the following
     295    structure:
     296    - fuel: centre, left, right
     297    - n1: left, right
     298    - reverser: left, right."""
     299    def __init__(self):
     300        super(F70, self).__init__(const.AIRCRAFT_F70)
     301
     302#---------------------------------------------------------------------------------------
     303
     304class DC3(Aircraft):
     305    """Lisunov Li-2 (DC-3) aircraft.
     306
     307    The aircraft type-specific values in the aircraft state have the following
     308    structure:
     309    - fuel: left, right, left aux, right aix
     310    - rpm: left, right
     311    - reverser: left, right."""
     312    def __init__(self):
     313        super(DC3, self).__init__(const.AIRCRAFT_DC3)
     314
     315#---------------------------------------------------------------------------------------
     316
     317class T134(Aircraft):
     318    """Tupolev Tu-134 aircraft.
     319
     320    The aircraft type-specific values in the aircraft state have the following
     321    structure:
     322    - fuel: centre, left tip, left aux, right tip, right aux, external 1,
     323    external 2
     324    - n1: left, right
     325    - reverser: left, right."""
     326    def __init__(self):
     327        super(T134, self).__init__(const.AIRCRAFT_T134)
     328
     329#---------------------------------------------------------------------------------------
     330
     331class T154(Aircraft):
     332    """Tupolev Tu-154 aircraft.
     333
     334    The aircraft type-specific values in the aircraft state have the following
     335    structure:
     336    - fuel: centre, left, right, centre 2, left aux, right aux
     337    - n1: left, centre, right
     338    - reverser: left, right"""
     339    def __init__(self):
     340        super(T154, self).__init__(const.AIRCRAFT_T154)
     341
     342#---------------------------------------------------------------------------------------
     343
     344class YK40(Aircraft):
     345    """Yakovlev Yak-40 aircraft.
     346
     347    The aircraft type-specific values in the aircraft state have the following
     348    structure:
     349    - fuel: left, right
     350    - n1: left, right
     351    - reverser: left, right"""
     352    def __init__(self):
     353        super(YK40, self).__init__(const.AIRCRAFT_YK40)
     354
     355#---------------------------------------------------------------------------------------
     356
  • src/const.py

    r6 r7  
    3434AIRCRAFT_B738 = 3
    3535
    36 # Aircraft type: Dash-8 Q400
    37 AIRCRAFT_DH8D = 4
    38 
    3936# Aircraft type: Boeing 737-300
    40 AIRCRAFT_B733 = 5
     37AIRCRAFT_B733 = 4
    4138
    4239# Aircraft type: Boeing 737-400
    43 AIRCRAFT_B734 = 6
     40AIRCRAFT_B734 = 5
    4441
    4542# Aircraft type: Boeing 737-500
    46 AIRCRAFT_B735 = 7
     43AIRCRAFT_B735 = 6
     44
     45# Aircraft type: Dash-8 Q400
     46AIRCRAFT_DH8D = 7
    4747
    4848# Aircraft type: Boeing 767-200
     
    5050
    5151# Aircraft type: Boeing 767-300
    52 AIRCRAFT_B762 = 9
     52AIRCRAFT_B763 = 9
    5353
    5454# Aircraft type: Canadair CRJ-200
     
    5858AIRCRAFT_F70 = 11
    5959
    60 # Aircraft type: Lisunov Li-3
     60# Aircraft type: Lisunov Li-2
    6161AIRCRAFT_DC3 = 12
    6262
  • src/fsuipc.py

    r6 r7  
    498498                      ("nav2", 0x0352, "H")]
    499499
     500    genericModels = { const.AIRCRAFT.B736 : B737Model,
     501                      const.AIRCRAFT_B737 : B737Model,
     502                      const.AIRCRAFT_B738 : B737Model,
     503                      const.AIRCRAFT_B733 : B737Model,
     504                      const.AIRCRAFT_B734 : B737Model,
     505                      const.AIRCRAFT_B735 : B737Model,
     506                      const.AIRCRAFT_DH8D : DH8DModel,
     507                      const.AIRCRAFT_B762 : B767Model,
     508                      const.AIRCRAFT_B763 : B767Model,
     509                      const.AIRCRAFT_CRJ2 : B767Model,
     510                      const.AIRCRAFT_F79  : F70Model,
     511                      const.AIRCRAFT_DC3  : DC3Model,
     512                      const.AIRCRAFT_T134 : T134Model,
     513                      const.AIRCRAFT_T154 : T154Model,
     514                      const.AIRCRAFT_YK40 : YK40Model }
     515
     516    specialModels = []
     517
     518    @staticmethod
     519    def registerSpecial(clazz):
     520        """Register the given class as a special model."""
     521        AircraftModel.specialModels.append(clazz)
     522
    500523    @staticmethod
    501524    def create(aircraft, aircraftName):
    502525        """Create the model for the given aircraft name, and notify the
    503         aircraft about it."""       
    504         return AircraftModel([0, 10, 20, 30])
     526        aircraft about it."""
     527        for specialModel in AircraftModel.specialModels:
     528            if specialModel.doesHandle(aircraft, aircraftName):
     529                return specialModel(aircraft, aircraftName)
     530       
     531        if aircraft.type in AircraftModel.genericModels:
     532            return AircraftModel.genericModels[aircraft.type]()
     533        else:
     534            return GenericModel()
    505535
    506536    @staticmethod
     
    530560        """Determine if the model handles the given aircraft name.
    531561       
    532         This default implementation returns True."""
    533         return True
    534 
    535     def addDataWithIndexMembers(self, dest, prefix, data):
     562        This default implementation returns False."""
     563        return False
     564
     565    def _addOffsetWithIndexMember(self, dest, offset, type, attrName = None):
     566        """Add the given FSUIPC offset and type to the given array and a member
     567        attribute with the given name."""       
     568        dest.append((offset, type))
     569        if attrName is not None:
     570            setattr(self, attrName, len(dest))
     571
     572    def _addDataWithIndexMembers(self, dest, prefix, data):
    536573        """Add FSUIPC data to the given array and also corresponding index
    537574        member variables with the given prefix.
     
    544581       
    545582        The latter two items will be appended to dest."""
    546         index = len(dest)
    547583        for (name, offset, type) in data:
    548             setattr(self, prefix + name, index)
    549             dest.append((offset, type))
    550             index += 1
     584            self._addOffsetWithIndexMember(dest, offset, type, prefix + name)
    551585           
    552586    def addMonitoringData(self, data):
    553         """Get the data specification for monitoring.
    554        
    555         Add the model-specific monitoring data to the given array."""
     587        """Add the model-specific monitoring data to the given array."""
    556588        self.addDataWithIndexMembers(data, "_monidx_",
    557589                                     AircraftModel.monitoringData)
     
    642674#------------------------------------------------------------------------------
    643675
     676class GenericAircraftModel(AircraftModel):
     677    """A generic aircraft model that can handle the fuel levels, the N1 or RPM
     678    values and some other common parameters in a generic way."""
     679    def __init__(self, flapsNotches, fuelInfo, numEngines, isN1 = True):
     680        """Construct the generic aircraft model with the given data.
     681
     682        flapsNotches is an array of how much degrees the individual flaps
     683        notches mean.
     684
     685        fuelInfo is an array of FSUIPC offsets for the levels of the fuel
     686        tanks. It is assumed to be a 4-byte value, followed by another 4-byte
     687        value, which is the fuel tank capacity.
     688
     689        numEngines is the number of engines the aircraft has.
     690
     691        isN1 determines if the engines have an N1 value or an RPM value
     692        (e.g. pistons)."""
     693        super(GenericAircraftModel, self).__init__(flapsNotches = flapsNotches)
     694
     695        self._fuelInfo = fuelInfo
     696        self._fuelStartIndex = None
     697        self._numEngines = numEngines
     698        self._engineStartIndex = None
     699        self._isN1 = isN1
     700
     701    def addMonitoringData(self, data):
     702        """Add the model-specific monitoring data to the given array."""
     703        super(GenericAircraftModel, self).addMonitoringData(data)
     704       
     705        self._addOffsetWithIndexMember(data, 0x0af4, "H", "_monidx_fuelWeight")
     706
     707        self._fuelStartIndex = len(data)
     708        for offset in self._fuelInfo:
     709            self._addOffsetWithIndexMember(data, offset, "u")    # tank level
     710            self._addOffsetWithIndexMember(data, offset+4, "u")  # tank capacity
     711
     712        if self._isN1:
     713            self._engineStartIndex = len(data)
     714            for i in range(0, self._numEngines):
     715                self._addOffsetWithIndexMember(data, 0x0898 + i * 0x98, "u")  # N1
     716                self._addOffsetWithIndexMember(data, 0x088c + i * 0x98, "d")  # throttle lever
     717       
     718    def getAircraftState(self, aircraft, data):
     719        """Get the aircraft state.
     720
     721        Get it from the parent, and then add the data about the fuel levels and
     722        the engine parameters."""
     723        state = super(GenericAircraftModel, self).getAircraftState(aircraft,
     724                                                                   data)
     725
     726        fuelWeight = data[self._monidx_fuelWeight]/256.0
     727        state.fuel = []
     728        for i in range(self._fuelStartIndex,
     729                       self._fuelStartIndex + 2*len(self._fuelInfo), 2):
     730            fuel = data[i+1]*data[i]*fuelWeight*const.LBSTOKG/128.0/65536.0
     731            state.fuel.append(fuel)
     732
     733        state.n1 = []
     734        state.reverser = []
     735        for i in range(self._engineStartIndex,
     736                       self._engineStartIndex + 2*self._numEngines, 2):
     737            state.n1.append(data[i]*100.0/16384.0)
     738            state.reverser.append(data[i+1]<0)
     739
     740        return state
     741
     742#------------------------------------------------------------------------------
     743
     744class GenericModel(GenericAircraftModel):
     745    """Generic aircraft model for an unknown type."""
     746    def __init__(self):
     747        """Construct the model."""
     748        super(GenericAircraftModel, self).
     749            __init__(flapsNotches = [0, 10, 20, 30],
     750                     fuelInfo = [0x0b74, 0x0b7c, 0xb94],
     751                     numEngines = 2)
     752
     753    @property
     754    def name(self):
     755        """Get the name for this aircraft model."""
     756        return "FSUIPC/Generic"   
     757
     758#------------------------------------------------------------------------------
     759
     760class B737Model(GenericAircraftModel):
     761    """Generic model for the Boeing 737 Classing and NG aircraft."""
     762    def __init__(self):
     763        """Construct the model."""
     764        super(GenericAircraftModel, self).
     765            __init__(flapsNotches = [0, 1, 2, 5, 10, 15, 25, 30, 40],
     766                     fuelInfo = [0x0b74, 0x0b7c, 0xb94],
     767                     numEngines = 2)
     768
     769    @property
     770    def name(self):
     771        """Get the name for this aircraft model."""
     772        return "FSUIPC/Generic Boeing 737"
     773
     774#------------------------------------------------------------------------------
     775
     776class B767Model(GenericAircraftModel):
     777    """Generic model for the Boeing 767 aircraft."""
     778    def __init__(self):
     779        """Construct the model."""
     780        super(GenericAircraftModel, self).
     781            __init__(flapsNotches = [0, 1, 5, 15, 20, 25, 30],
     782                     fuelInfo = [0x0b74, 0x0b7c, 0xb94],
     783                     numEngines = 2)
     784
     785    @property
     786    def name(self):
     787        """Get the name for this aircraft model."""
     788        return "FSUIPC/Generic Boeing 767"
     789
     790#------------------------------------------------------------------------------
     791
     792class DH8DModel(GenericAircraftModel):
     793    """Generic model for the Boeing 737 NG aircraft."""
     794    def __init__(self):
     795        """Construct the model."""
     796        super(GenericAircraftModel, self).
     797            __init__(flapsNotches = [0, 5, 10, 15, 35],
     798                     fuelInfo = [0x0b74, 0x0b7c, 0xb94],
     799                     numEngines = 2)
     800
     801    @property
     802    def name(self):
     803        """Get the name for this aircraft model."""
     804        return "FSUIPC/Generic Bombardier Dash-8 Q400"
     805
     806#------------------------------------------------------------------------------
     807
     808class CRJ2Model(GenericAircraftModel):
     809    """Generic model for the Bombardier CRJ-200 aircraft."""
     810    def __init__(self):
     811        """Construct the model."""
     812        super(GenericAircraftModel, self).
     813            __init__(flapsNotches = [0, 8, 20, 30, 45],
     814                     fuelInfo = [0x0b74, 0x0b7c, 0xb94],
     815                     numEngines = 2)
     816
     817    @property
     818    def name(self):
     819        """Get the name for this aircraft model."""
     820        return "FSUIPC/Generic Bombardier CRJ-200"
     821
     822#------------------------------------------------------------------------------
     823
     824class F70Model(GenericAircraftModel):
     825    """Generic model for the Fokker F70 aircraft."""
     826    def __init__(self):
     827        """Construct the model."""
     828        super(GenericAircraftModel, self).
     829            __init__(flapsNotches = [0, 8, 15, 25, 42],
     830                     fuelInfo = [0x0b74, 0x0b7c, 0xb94],
     831                     numEngines = 2)
     832
     833    @property
     834    def name(self):
     835        """Get the name for this aircraft model."""
     836        return "FSUIPC/Generic Fokker 70"
     837
     838#------------------------------------------------------------------------------
     839
     840class DC3Model(GenericAircraftModel):
     841    """Generic model for the Lisunov Li-2 (DC-3) aircraft."""
     842    def __init__(self):
     843        """Construct the model."""
     844        super(GenericAircraftModel, self).
     845            __init__(flapsNotches = [0, 15, 30, 45],
     846                     fuelInfo = [0x0b7c, 0x0b84, 0x0b94, 0x0b9c],
     847                     numEngines = 2)
     848
     849    @property
     850    def name(self):
     851        """Get the name for this aircraft model."""
     852        return "FSUIPC/Generic Lisunov Li-2"
     853
     854#------------------------------------------------------------------------------
     855
     856class T134Model(GenericAircraftModel):
     857    """Generic model for the Tupolev Tu-134 aircraft."""
     858    def __init__(self):
     859        """Construct the model."""
     860        super(GenericAircraftModel, self).
     861            __init__(flapsNotches = [0, 10, 20, 30],
     862                     fuelInfo = [0x0b74,
     863                                 0x0b8c, 0x0b84,
     864                                 0x0ba4, 0x0b9c,
     865                                 0x1254, 0x125c],
     866                     numEngines = 2)
     867
     868    @property
     869    def name(self):
     870        """Get the name for this aircraft model."""
     871        return "FSUIPC/Generic Tupolev Tu-134"
     872
     873#------------------------------------------------------------------------------
     874
     875class T154Model(GenericAircraftModel):
     876    """Generic model for the Tupolev Tu-134 aircraft."""
     877    def __init__(self):
     878        """Construct the model."""
     879        super(GenericAircraftModel, self).
     880            __init__(flapsNotches = [0, 15, 28, 45],
     881                     fuelInfo = [0x0b74, 0x0b7c, 0x0b94,
     882                                 0x1244, 0x0b84, 0x0b9c]
     883                     numEngines = 3)
     884
     885    @property
     886    def name(self):
     887        """Get the name for this aircraft model."""
     888        return "FSUIPC/Generic Tupolev Tu-154"
     889
     890    def getAircraftState(self, aircraft, data):
     891        """Get an aircraft state object for the given monitoring data.
     892
     893        This removes the reverser value for the middle engine."""
     894        state = super(T154Model, self).getAircraftState(aircraft, data)
     895        del state.reverser[1]
     896        return state
     897
     898#------------------------------------------------------------------------------
     899
     900class YK40Model(GenericAircraftModel):
     901    """Generic model for the Yakovlev Yak-40 aircraft."""
     902    def __init__(self):
     903        """Construct the model."""
     904        super(GenericAircraftModel, self).
     905            __init__(flapsNotches = [0, 20, 35],
     906                     fuelInfo = [0x0b7c, 0x0b94]
     907                     numEngines = 2)
     908
     909    @property
     910    def name(self):
     911        """Get the name for this aircraft model."""
     912        return "FSUIPC/Generic Yakovlev Yak-40"
     913
     914#------------------------------------------------------------------------------
     915
Note: See TracChangeset for help on using the changeset viewer.