Example #1
0
def encode(params, validate=False):
    '''Create a whalenotice binary message payload to pack into an AIS Msg whalenotice.

    Fields in params:
      - MessageID(uint): AIS message number.  Must be 8 (field automatically set to "8")
      - RepeatIndicator(uint): Indicated how many times a message has been repeated
      - UserID(uint): Unique ship identification number (MMSI)
      - Spare(uint): Reserved for definition by a regional authority. (field automatically set to "0")
      - dac(uint): Designated Area Code - 366 for the United States (field automatically set to "366")
      - fid(uint): Functional IDentifier - 63 for the Whale Notice (field automatically set to "63")
      - day(uint): Time of most recent whale detection.  UTC day of the month 1..31
      - hour(uint): Time of most recent whale detection.  UTC hours 0..23
      - min(uint): Time of most recent whale detection.  UTC minutes
      - stationid(uint): Identifier of the station that recorded the whale.  Usually a number.
      - longitude(decimal): Center of the detection zone.  East West location
      - latitude(decimal): Center of the detection zone.  North South location
      - timetoexpire(uint): Minutes from the detection time until the notice expires
      - radius(uint): Distance from center of detection zone (lat/lon above)
    @param params: Dictionary of field names/values.  Throws a ValueError exception if required is missing
    @param validate: Set to true to cause checking to occur.  Runs slower.  FIX: not implemented.
    @rtype: BitVector
    @return: encoded binary message (for binary messages, this needs to be wrapped in a msg 8
    @note: The returned bits may not be 6 bit aligned.  It is up to you to pad out the bits.
    '''

    bvList = []
    bvList.append(binary.setBitVectorSize(BitVector(intVal=8),6))
    if 'RepeatIndicator' in params:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=params['RepeatIndicator']),2))
    else:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=0),2))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['UserID']),30))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=0),2))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=366),10))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=63),6))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['day']),5))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['hour']),5))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['min']),6))
    if 'stationid' in params:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=params['stationid']),8))
    else:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=0),8))
    if 'longitude' in params:
        bvList.append(binary.bvFromSignedInt(int(Decimal(params['longitude'])*Decimal('600000')),28))
    else:
        bvList.append(binary.bvFromSignedInt(108600000,28))
    if 'latitude' in params:
        bvList.append(binary.bvFromSignedInt(int(Decimal(params['latitude'])*Decimal('600000')),27))
    else:
        bvList.append(binary.bvFromSignedInt(54600000,27))
    if 'timetoexpire' in params:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=params['timetoexpire']),16))
    else:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=0),16))
    if 'radius' in params:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=params['radius']),16))
    else:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=65535),16))

    return binary.joinBV(bvList)
Example #2
0
def encode(params, validate=False):
    '''Create a sls_wind binary message payload to pack into an AIS Msg sls_wind.

    Fields in params:
      - time_month(uint): Time tag of measurement  month 1..12
      - time_day(uint): Time tag of measurement  day of the month 1..31
      - time_hour(uint): Time tag of measurement  UTC hours 0..23
      - time_min(uint): Time tag of measurement  minutes
      - stationid(aisstr6): Character identifier of the station
      - pos_longitude(decimal): Location of measurement  East West location
      - pos_latitude(decimal): Location of measurement  North South location
      - speed(udecimal): Average wind speed
      - gust(udecimal): Wind gust
      - direction(uint): Wind direction
      - reserved(uint): Reserved bits for future use (field automatically set to "0")
    @param params: Dictionary of field names/values.  Throws a ValueError exception if required is missing
    @param validate: Set to true to cause checking to occur.  Runs slower.  FIX: not implemented.
    @rtype: BitVector
    @return: encoded binary message (for binary messages, this needs to be wrapped in a msg 8
    @note: The returned bits may not be 6 bit aligned.  It is up to you to pad out the bits.
    '''

    bvList = []
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['time_month']),4))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['time_day']),5))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['time_hour']),5))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['time_min']),6))
    if 'stationid' in params:
        bvList.append(aisstring.encode(params['stationid'],42))
    else:
        bvList.append(aisstring.encode('@@@@@@@',42))
    if 'pos_longitude' in params:
        bvList.append(binary.bvFromSignedInt(int(Decimal(params['pos_longitude'])*Decimal('60000')),25))
    else:
        bvList.append(binary.bvFromSignedInt(10860000,25))
    if 'pos_latitude' in params:
        bvList.append(binary.bvFromSignedInt(int(Decimal(params['pos_latitude'])*Decimal('60000')),24))
    else:
        bvList.append(binary.bvFromSignedInt(5460000,24))
    if 'speed' in params:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=int((Decimal(params['speed'])*Decimal('10')))),10))
    else:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=int(1023)),10))
    if 'gust' in params:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=int((Decimal(params['gust'])*Decimal('10')))),10))
    else:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=int(1023)),10))
    if 'direction' in params:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=params['direction']),9))
    else:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=511),9))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=0),4))

    return binary.joinBV(bvList)
Example #3
0
def encode(params, validate=False):
    '''Create a alltypesmsg binary message payload to pack into an AIS Msg alltypesmsg.

    Fields in params:
      - dac(uint): Designated Area Code (field automatically set to "366")
      - reqDecimal(decimal): required decimal value... FIX: scale or no? (field automatically set to "122")
      - unavail_uint(uint): Unavailable unsigned integer
      - anUInt(uint): NO unavailable unsigned integer
      - anInt(int): NO unavailable signed integer
      - aBool(bool): Simple bool
      - aStr(aisstr6): An ais string of 5 characters
      - anUDecimal(udecimal): An unsigned decimal.  Allow smaller numbers
      - aDecimal(decimal): A decimal
      - aFloat(float): An IEEE floating point number
    @param params: Dictionary of field names/values.  Throws a ValueError exception if required is missing
    @param validate: Set to true to cause checking to occur.  Runs slower.  FIX: not implemented.
    @rtype: BitVector
    @return: encoded binary message (for binary messages, this needs to be wrapped in a msg 8
    @note: The returned bits may not be 6 bit aligned.  It is up to you to pad out the bits.
    '''

    bvList = []
    bvList.append(binary.setBitVectorSize(BitVector(intVal=366), 16))
    bvList.append(binary.bvFromSignedInt(122, 8))
    if 'unavail_uint' in params:
        bvList.append(
            binary.setBitVectorSize(BitVector(intVal=params['unavail_uint']),
                                    2))
    else:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=3), 2))
    bvList.append(
        binary.setBitVectorSize(BitVector(intVal=params['anUInt']), 2))
    bvList.append(binary.bvFromSignedInt(params['anInt'], 3))
    if params["aBool"]: bvList.append(TrueBV)
    else: bvList.append(FalseBV)
    bvList.append(aisstring.encode(params['aStr'], 30))
    bvList.append(
        binary.setBitVectorSize(
            BitVector(intVal=int((Decimal(params['anUDecimal']) *
                                  Decimal('10')))), 16))
    bvList.append(
        binary.bvFromSignedInt(
            int(Decimal(params['aDecimal']) * Decimal('10')), 16))
    bvList.append(binary.float2bitvec(params['aFloat']))

    return binary.joinBV(bvList)
Example #4
0
def encode(params, validate=False):
    '''Create a gnss_correction binary message payload to pack into an AIS Msg gnss_correction.

    Fields in params:
      - MessageID(uint): AIS message number.  Must be 17 (field automatically set to "17")
      - RepeatIndicator(uint): Indicated how many times a message has been repeated
      - UserID(uint): Base station identification number (MMSI)
      - Spare(uint): Reserved for definition by a regional authority. (field automatically set to "0")
      - x(decimal): East West location
      - y(decimal): North South location
      - Spare2(uint): Reserved for definition by a regional authority. (field automatically set to "0")
      - BinaryData(binary): GNSS Differential correction data
    @param params: Dictionary of field names/values.  Throws a ValueError exception if required is missing
    @param validate: Set to true to cause checking to occur.  Runs slower.  FIX: not implemented.
    @rtype: BitVector
    @return: encoded binary message (for binary messages, this needs to be wrapped in a msg 8
    @note: The returned bits may not be 6 bit aligned.  It is up to you to pad out the bits.
    '''

    bvList = []
    bvList.append(binary.setBitVectorSize(BitVector(intVal=17), 6))
    if 'RepeatIndicator' in params:
        bvList.append(
            binary.setBitVectorSize(
                BitVector(intVal=params['RepeatIndicator']), 2))
    else:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=0), 2))
    bvList.append(
        binary.setBitVectorSize(BitVector(intVal=params['UserID']), 30))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=0), 2))
    if 'x' in params:
        bvList.append(
            binary.bvFromSignedInt(int(Decimal(params['x']) * Decimal('600')),
                                   18))
    else:
        bvList.append(binary.bvFromSignedInt(108600, 18))
    if 'y' in params:
        bvList.append(
            binary.bvFromSignedInt(int(Decimal(params['y']) * Decimal('600')),
                                   17))
    else:
        bvList.append(binary.bvFromSignedInt(54600, 17))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=0), 5))
    bvList.append(params['BinaryData'])

    return binary.joinBV(bvList)
Example #5
0
def encode(params, validate=False):
    '''Create a sls_wind binary message payload to pack into an AIS Msg sls_wind.

    Fields in params:
      - time_month(uint): Time tag of measurement  month 1..12
      - time_day(uint): Time tag of measurement  day of the month 1..31
      - time_hour(uint): Time tag of measurement  UTC hours 0..23
      - time_min(uint): Time tag of measurement  minutes
      - stationid(aisstr6): Character identifier of the station
      - pos_longitude(decimal): Location of measurement  East West location
      - pos_latitude(decimal): Location of measurement  North South location
      - flow(uint): Water flow
      - reserved(uint): Reserved bits for future use (field automatically set to "0")
    @param params: Dictionary of field names/values.  Throws a ValueError exception if required is missing
    @param validate: Set to true to cause checking to occur.  Runs slower.  FIX: not implemented.
    @rtype: BitVector
    @return: encoded binary message (for binary messages, this needs to be wrapped in a msg 8
    @note: The returned bits may not be 6 bit aligned.  It is up to you to pad out the bits.
    '''

    bvList = []
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['time_month']),4))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['time_day']),5))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['time_hour']),5))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['time_min']),6))
    if 'stationid' in params:
        bvList.append(aisstring.encode(params['stationid'],42))
    else:
        bvList.append(aisstring.encode('@@@@@@@',42))
    if 'pos_longitude' in params:
        bvList.append(binary.bvFromSignedInt(int(Decimal(params['pos_longitude'])*Decimal('60000')),25))
    else:
        bvList.append(binary.bvFromSignedInt(10860000,25))
    if 'pos_latitude' in params:
        bvList.append(binary.bvFromSignedInt(int(Decimal(params['pos_latitude'])*Decimal('60000')),24))
    else:
        bvList.append(binary.bvFromSignedInt(5460000,24))
    if 'flow' in params:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=params['flow']),10))
    else:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=16383),10))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=0),19))

    return binary.joinBV(bvList)
Example #6
0
def encode(params, validate=False):
    '''Create a gnss_correction binary message payload to pack into an AIS Msg gnss_correction.

    Fields in params:
      - MessageID(uint): AIS message number.  Must be 17 (field automatically set to "17")
      - RepeatIndicator(uint): Indicated how many times a message has been repeated
      - UserID(uint): Base station identification number (MMSI)
      - Spare(uint): Reserved for definition by a regional authority. (field automatically set to "0")
      - x(decimal): East West location
      - y(decimal): North South location
      - Spare2(uint): Reserved for definition by a regional authority. (field automatically set to "0")
      - BinaryData(binary): GNSS Differential correction data
    @param params: Dictionary of field names/values.  Throws a ValueError exception if required is missing
    @param validate: Set to true to cause checking to occur.  Runs slower.  FIX: not implemented.
    @rtype: BitVector
    @return: encoded binary message (for binary messages, this needs to be wrapped in a msg 8
    @note: The returned bits may not be 6 bit aligned.  It is up to you to pad out the bits.
    '''

    bvList = []
    bvList.append(binary.setBitVectorSize(BitVector(intVal=17),6))
    if 'RepeatIndicator' in params:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=params['RepeatIndicator']),2))
    else:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=0),2))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['UserID']),30))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=0),2))
    if 'x' in params:
        bvList.append(binary.bvFromSignedInt(int(Decimal(params['x'])*Decimal('600')),18))
    else:
        bvList.append(binary.bvFromSignedInt(108600,18))
    if 'y' in params:
        bvList.append(binary.bvFromSignedInt(int(Decimal(params['y'])*Decimal('600')),17))
    else:
        bvList.append(binary.bvFromSignedInt(54600,17))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=0),5))
    bvList.append(params['BinaryData'])

    return binary.joinBV(bvList)
Example #7
0
def encode(params, validate=False):
    '''Create a alltypesmsg binary message payload to pack into an AIS Msg alltypesmsg.

    Fields in params:
      - dac(uint): Designated Area Code (field automatically set to "366")
      - reqDecimal(decimal): required decimal value... FIX: scale or no? (field automatically set to "122")
      - unavail_uint(uint): Unavailable unsigned integer
      - anUInt(uint): NO unavailable unsigned integer
      - anInt(int): NO unavailable signed integer
      - aBool(bool): Simple bool
      - aStr(aisstr6): An ais string of 5 characters
      - anUDecimal(udecimal): An unsigned decimal.  Allow smaller numbers
      - aDecimal(decimal): A decimal
      - aFloat(float): An IEEE floating point number
    @param params: Dictionary of field names/values.  Throws a ValueError exception if required is missing
    @param validate: Set to true to cause checking to occur.  Runs slower.  FIX: not implemented.
    @rtype: BitVector
    @return: encoded binary message (for binary messages, this needs to be wrapped in a msg 8
    @note: The returned bits may not be 6 bit aligned.  It is up to you to pad out the bits.
    '''

    bvList = []
    bvList.append(binary.setBitVectorSize(BitVector(intVal=366),16))
    bvList.append(binary.bvFromSignedInt(122,8))
    if 'unavail_uint' in params:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=params['unavail_uint']),2))
    else:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=3),2))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['anUInt']),2))
    bvList.append(binary.bvFromSignedInt(params['anInt'],3))
    if params["aBool"]: bvList.append(TrueBV)
    else: bvList.append(FalseBV)
    bvList.append(aisstring.encode(params['aStr'],30))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=int((Decimal(params['anUDecimal'])*Decimal('10')))),16))
    bvList.append(binary.bvFromSignedInt(int(Decimal(params['aDecimal'])*Decimal('10')),16))
    bvList.append(binary.float2bitvec(params['aFloat']))

    return binary.joinBV(bvList)
Example #8
0
def encode(params, validate=False):
    '''Create a sls_waterlevel binary message payload to pack into an AIS Msg sls_waterlevel.

    Fields in params:
      - time_month(uint): Time tag of measurement  month 1..12
      - time_day(uint): Time tag of measurement  day of the month 1..31
      - time_hour(uint): Time tag of measurement  UTC hours 0..23
      - time_min(uint): Time tag of measurement  minutes
      - stationid(aisstr6): Character identifier of the station.  Usually a number.
      - pos_longitude(decimal): Location of measurement  East West location
      - pos_latitude(decimal): Location of measurement  North South location
      - type(uint): How to interpret the water level
      - waterlevel(int): Water level in centimeters
      - datum(uint): What reference datum applies to the value
      - reserved(uint): Reserved bits for future use (field automatically set to "0")
    @param params: Dictionary of field names/values.  Throws a ValueError exception if required is missing
    @param validate: Set to true to cause checking to occur.  Runs slower.  FIX: not implemented.
    @rtype: BitVector
    @return: encoded binary message (for binary messages, this needs to be wrapped in a msg 8
    @note: The returned bits may not be 6 bit aligned.  It is up to you to pad out the bits.
    '''

    bvList = []
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['time_month']),4))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['time_day']),5))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['time_hour']),5))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['time_min']),6))
    if 'stationid' in params:
        bvList.append(aisstring.encode(params['stationid'],42))
    else:
        bvList.append(aisstring.encode('@@@@@@@',42))
    if 'pos_longitude' in params:
        bvList.append(binary.bvFromSignedInt(int(Decimal(params['pos_longitude'])*Decimal('60000')),25))
    else:
        bvList.append(binary.bvFromSignedInt(10860000,25))
    if 'pos_latitude' in params:
        bvList.append(binary.bvFromSignedInt(int(Decimal(params['pos_latitude'])*Decimal('60000')),24))
    else:
        bvList.append(binary.bvFromSignedInt(5460000,24))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['type']),1))
    if 'waterlevel' in params:
        bvList.append(binary.bvFromSignedInt(params['waterlevel'],16))
    else:
        bvList.append(binary.bvFromSignedInt(-32768,16))
    if 'datum' in params:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=params['datum']),2))
    else:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=31),2))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=0),14))

    return binary.joinBV(bvList)
Example #9
0
def decimal_enc(val, bitSize):
    '''@rtype: BitVector'''
    # FIX: make sure there is no remainder
    return binary.bvFromSignedInt(int(val), bitSize)
Example #10
0
def float_enc(val, bitSize):
    '''@rtype: BitVector'''
    bv = binary.bvFromSignedInt(int(val), bitSize)
    return binary.setBitVectorSize(bv, bitSize)
Example #11
0
def int_enc(val,bitSize):
    '''@rtype: BitVector'''
    return binary.bvFromSignedInt(int(val),bitSize)
Example #12
0
def int_enc(val, bitSize):
    '''@rtype: BitVector'''
    return binary.bvFromSignedInt(int(val), bitSize)
Example #13
0
def encode(params, validate=False):
    '''Create a ChanMngmt binary message payload to pack into an AIS Msg ChanMngmt.

    Fields in params:
      - MessageID(uint): AIS message number.  Must be 22 (field automatically set to "22")
      - RepeatIndicator(uint): Indicated how many times a message has been repeated
      - UserID(uint): Unique ship identification number (MMSI)
      - Spare(uint): Not used.  Should be set to zero. (field automatically set to "0")
      - ChanA(uint): Channel number from ITU-R M.1084 Annex 4
      - ChanB(uint): Channel number from ITU-R M.1084 Annex 4
      - TxRxMode(uint): FIX: find the description
      - power(uint): FIX: put in a description
      - corner1_lon(decimal): north-east corner of area for assignment  longitude of corner
      - corner1_lat(decimal): north-east corner of area for assignment  latitude of corner
      - corner2_lon(decimal): south-west corner of area for assignment  longitude of corner
      - corner2_lat(decimal): south-west corner of area for assignment  latitude of corner
      - IndicatorType(uint): FIX: put in a description
      - ChanABandwidth(uint): FIX: put in a description
      - ChanBBandwidth(uint): FIX: put in a description
      - TransZoneSize(uint): FIX: put in a description
      - Spare2(uint): Not used.  Should be set to zero. (field automatically set to "0")
    @param params: Dictionary of field names/values.  Throws a ValueError exception if required is missing
    @param validate: Set to true to cause checking to occur.  Runs slower.  FIX: not implemented.
    @rtype: BitVector
    @return: encoded binary message (for binary messages, this needs to be wrapped in a msg 8
    @note: The returned bits may not be 6 bit aligned.  It is up to you to pad out the bits.
    '''

    bvList = []
    bvList.append(binary.setBitVectorSize(BitVector(intVal=22),6))
    if 'RepeatIndicator' in params:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=params['RepeatIndicator']),2))
    else:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=0),2))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['UserID']),30))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=0),2))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['ChanA']),12))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['ChanB']),12))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['TxRxMode']),4))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['power']),1))
    if 'corner1_lon' in params:
        bvList.append(binary.bvFromSignedInt(int(Decimal(params['corner1_lon'])*Decimal('600')),18))
    else:
        bvList.append(binary.bvFromSignedInt(108600,18))
    if 'corner1_lat' in params:
        bvList.append(binary.bvFromSignedInt(int(Decimal(params['corner1_lat'])*Decimal('600')),17))
    else:
        bvList.append(binary.bvFromSignedInt(108600,17))
    if 'corner2_lon' in params:
        bvList.append(binary.bvFromSignedInt(int(Decimal(params['corner2_lon'])*Decimal('600')),18))
    else:
        bvList.append(binary.bvFromSignedInt(108600,18))
    if 'corner2_lat' in params:
        bvList.append(binary.bvFromSignedInt(int(Decimal(params['corner2_lat'])*Decimal('600')),17))
    else:
        bvList.append(binary.bvFromSignedInt(108600,17))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['IndicatorType']),1))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['ChanABandwidth']),1))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['ChanBBandwidth']),1))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['TransZoneSize']),3))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=0),23))

    return binary.joinBV(bvList)
Example #14
0
def decimal_enc(val,bitSize):
    '''@rtype: BitVector'''
    # FIX: make sure there is no remainder
    return binary.bvFromSignedInt(int(val),bitSize)
Example #15
0
def float_enc(val,bitSize):
    '''@rtype: BitVector'''
    bv = binary.bvFromSignedInt(int(val),bitSize)
    return binary.setBitVectorSize(bv,bitSize)
Example #16
0
def encode(params, validate=False):
    '''Create a sls_weatherreport binary message payload to pack into an AIS Msg sls_weatherreport.

    Fields in params:
      - time_month(uint): Time tag of measurement  month 1..12
      - time_day(uint): Time tag of measurement  day of the month 1..31
      - time_hour(uint): Time tag of measurement  UTC hours 0..23
      - time_min(uint): Time tag of measurement  minutes
      - stationid(aisstr6): Character identifier of the station
      - pos_longitude(decimal): Location of measurement  East West location
      - pos_latitude(decimal): Location of measurement  North South location
      - speed(udecimal): Average wind speed
      - gust(udecimal): Wind gust
      - direction(uint): Wind direction
      - atmpressure(udecimal): Atmospheric pressure
      - airtemp(decimal): Air temperature
      - dewpoint(decimal): Dew Point
      - visibility(udecimal): Visibility
      - watertemp(decimal): Water Temperature
      - reserved(uint): Reserved bits for future use (field automatically set to "0")
    @param params: Dictionary of field names/values.  Throws a ValueError exception if required is missing
    @param validate: Set to true to cause checking to occur.  Runs slower.  FIX: not implemented.
    @rtype: BitVector
    @return: encoded binary message (for binary messages, this needs to be wrapped in a msg 8
    @note: The returned bits may not be 6 bit aligned.  It is up to you to pad out the bits.
    '''

    bvList = []
    bvList.append(
        binary.setBitVectorSize(BitVector(intVal=params['time_month']), 4))
    bvList.append(
        binary.setBitVectorSize(BitVector(intVal=params['time_day']), 5))
    bvList.append(
        binary.setBitVectorSize(BitVector(intVal=params['time_hour']), 5))
    bvList.append(
        binary.setBitVectorSize(BitVector(intVal=params['time_min']), 6))
    if 'stationid' in params:
        bvList.append(aisstring.encode(params['stationid'], 42))
    else:
        bvList.append(aisstring.encode('@@@@@@@', 42))
    if 'pos_longitude' in params:
        bvList.append(
            binary.bvFromSignedInt(
                int(Decimal(params['pos_longitude']) * Decimal('60000')), 25))
    else:
        bvList.append(binary.bvFromSignedInt(10860000, 25))
    if 'pos_latitude' in params:
        bvList.append(
            binary.bvFromSignedInt(
                int(Decimal(params['pos_latitude']) * Decimal('60000')), 24))
    else:
        bvList.append(binary.bvFromSignedInt(5460000, 24))
    if 'speed' in params:
        bvList.append(
            binary.setBitVectorSize(
                BitVector(intVal=int((Decimal(params['speed']) *
                                      Decimal('10')))), 10))
    else:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=int(1023)), 10))
    if 'gust' in params:
        bvList.append(
            binary.setBitVectorSize(
                BitVector(intVal=int((Decimal(params['gust']) *
                                      Decimal('10')))), 10))
    else:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=int(1023)), 10))
    if 'direction' in params:
        bvList.append(
            binary.setBitVectorSize(BitVector(intVal=params['direction']), 9))
    else:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=511), 9))
    if 'atmpressure' in params:
        bvList.append(
            binary.setBitVectorSize(
                BitVector(intVal=int((Decimal(params['atmpressure']) *
                                      Decimal('10')))), 14))
    else:
        bvList.append(
            binary.setBitVectorSize(BitVector(intVal=int(163830)), 14))
    if 'airtemp' in params:
        bvList.append(
            binary.bvFromSignedInt(
                int(Decimal(params['airtemp']) * Decimal('10')), 10))
    else:
        bvList.append(binary.bvFromSignedInt(-512, 10))
    if 'dewpoint' in params:
        bvList.append(
            binary.bvFromSignedInt(
                int(Decimal(params['dewpoint']) * Decimal('10')), 10))
    else:
        bvList.append(binary.bvFromSignedInt(-512, 10))
    if 'visibility' in params:
        bvList.append(
            binary.setBitVectorSize(
                BitVector(intVal=int((Decimal(params['visibility']) *
                                      Decimal('10')))), 8))
    else:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=int(255)), 8))
    if 'watertemp' in params:
        bvList.append(
            binary.bvFromSignedInt(
                int(Decimal(params['watertemp']) * Decimal('10')), 10))
    else:
        bvList.append(binary.bvFromSignedInt(-512, 10))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=0), 4))

    return binary.joinBV(bvList)
Example #17
0
def encode(params, validate=False):
    """Create a waterlevel binary message payload to pack into an AIS Msg waterlevel.

    Fields in params:
      - MessageID(uint): AIS message number.  Must be 8 (field automatically set to "8")
      - RepeatIndicator(uint): Indicated how many times a message has been repeated
      - UserID(uint): Unique ship identification number (MMSI)
      - Spare(uint): Reserved for definition by a regional authority. (field automatically set to "0")
      - dac(uint): Designated Area Code (field automatically set to "366")
      - fid(uint): Functional Identifier (field automatically set to "63")
      - month(uint): Time the measurement represents  month 1..12
      - day(uint): Time the measurement represents  day of the month 1..31
      - hour(uint): Time the measurement represents  UTC hours 0..23
      - min(uint): Time the measurement represents  minutes
      - stationid(aisstr6): Character identifier of the station.  Usually a number.
      - waterlevel(int): Water level in centimeters
      - datum(uint): What reference datum applies to the value
      - sigma(uint): Standard deviation of 1 second samples used to compute the water level height.  FIX: is this the correct description of sigma?
      - source(uint): How the water level was derived
    @param params: Dictionary of field names/values.  Throws a ValueError exception if required is missing
    @param validate: Set to true to cause checking to occur.  Runs slower.  FIX: not implemented.
    @rtype: BitVector
    @return: encoded binary message (for binary messages, this needs to be wrapped in a msg 8
    @note: The returned bits may not be 6 bit aligned.  It is up to you to pad out the bits.
    """

    bvList = []
    bvList.append(binary.setBitVectorSize(BitVector(intVal=8), 6))
    if "RepeatIndicator" in params:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=params["RepeatIndicator"]), 2))
    else:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=0), 2))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params["UserID"]), 30))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=0), 2))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=366), 10))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=63), 6))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params["month"]), 4))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params["day"]), 5))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params["hour"]), 5))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params["min"]), 6))
    if "stationid" in params:
        bvList.append(aisstring.encode(params["stationid"], 42))
    else:
        bvList.append(aisstring.encode("@@@@@@@", 42))
    if "waterlevel" in params:
        bvList.append(binary.bvFromSignedInt(params["waterlevel"], 16))
    else:
        bvList.append(binary.bvFromSignedInt(-32768, 16))
    if "datum" in params:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=params["datum"]), 5))
    else:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=31), 5))
    if "sigma" in params:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=params["sigma"]), 7))
    else:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=127), 7))
    if "source" in params:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=params["source"]), 3))
    else:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=0), 3))

    return binary.joinBV(bvList)
def encode(params, validate=False):
    '''Create a timed_circular_notice binary message payload to pack into an AIS Msg timed_circular_notice.

    Fields in params:
      - MessageID(uint): AIS message number.  Must be 8 (field automatically set to "8")
      - RepeatIndicator(uint): Indicated how many times a message has been repeated
      - UserID(uint): Unique ship identification number (MMSI)
      - Spare(uint): Reserved for definition by a regional authority. (field automatically set to "0")
      - dac(uint): Designated Area Code - 366 for the United States (field automatically set to "366")
      - fid(uint): Functional IDentifier - 63 (field automatically set to "63")
      - month(uint): Start time of most recent notice  UTC month
      - day(uint): Start time of most recent notice  UTC day of the month 1..31
      - hour(uint): Start time of most recent notice  UTC hours 0..23
      - min(uint): Start time of most recent notice  UTC minutes
      - longitude(decimal): Center of the area/zone  East West location
      - latitude(decimal): Center of the area/zone  North South location
      - timetoexpire(uint): Minutes from the start time until the notice expires.  Max is aprox 23 days
      - radius(udecimal): Distance from center of detection zone (lat/lon above).  Distance in increments of 10 meters
      - areatype(uint): What does this circular area represent
    @param params: Dictionary of field names/values.  Throws a ValueError exception if required is missing
    @param validate: Set to true to cause checking to occur.  Runs slower.  FIX: not implemented.
    @rtype: BitVector
    @return: encoded binary message (for binary messages, this needs to be wrapped in a msg 8
    @note: The returned bits may not be 6 bit aligned.  It is up to you to pad out the bits.
    '''

    bvList = []
    bvList.append(binary.setBitVectorSize(BitVector(intVal=8),6))
    if 'RepeatIndicator' in params:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=params['RepeatIndicator']),2))
    else:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=0),2))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['UserID']),30))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=0),2))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=366),10))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=63),6))
    if 'month' in params:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=params['month']),4))
    else:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=0),4))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['day']),5))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['hour']),5))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['min']),6))
    if 'longitude' in params:
        bvList.append(binary.bvFromSignedInt(int(Decimal(params['longitude'])*Decimal('600000')),28))
    else:
        bvList.append(binary.bvFromSignedInt(108600000,28))
    if 'latitude' in params:
        bvList.append(binary.bvFromSignedInt(int(Decimal(params['latitude'])*Decimal('600000')),27))
    else:
        bvList.append(binary.bvFromSignedInt(54600000,27))
    if 'timetoexpire' in params:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=params['timetoexpire']),15))
    else:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=32767),15))
    if 'radius' in params:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=int((Decimal(params['radius'])*Decimal('0.1')))),14))
    else:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=int(16383)),14))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['areatype']),8))

    return binary.joinBV(bvList)
Example #19
0
def encode(params, validate=False):
    '''Create a whalenotice binary message payload to pack into an AIS Msg whalenotice.

    Fields in params:
      - MessageID(uint): AIS message number.  Must be 8 (field automatically set to "8")
      - RepeatIndicator(uint): Indicated how many times a message has been repeated
      - UserID(uint): Unique ship identification number (MMSI)
      - Spare(uint): Reserved for definition by a regional authority. (field automatically set to "0")
      - dac(uint): Designated Area Code - 366 for the United States (field automatically set to "366")
      - fid(uint): Functional IDentifier - 63 for the Whale Notice (field automatically set to "63")
      - efid(uint): Extended Functional IDentifier.  1 for the Whale Notice (dac+fid+efid defines the exact message type) (field automatically set to "1")
      - month(uint): Time of most recent whale detection.  UTC month 1..12
      - day(uint): Time of most recent whale detection.  UTC day of the month 1..31
      - hour(uint): Time of most recent whale detection.  UTC hours 0..23
      - min(uint): Time of most recent whale detection.  UTC minutes
      - sec(uint): Time of most recent whale detection.  UTC seconds
      - stationid(aisstr6): Identifier of the station that detected the whale.  (e.g. which buoy)
      - longitude(decimal): Center of the detection zone.  East West location
      - latitude(decimal): Center of the detection zone.  North South location
      - timetoexpire(uint): Seconds from the detection time until the notice expires
      - radius(uint): Distance from center of detection zone (lat/lon above)
    @param params: Dictionary of field names/values.  Throws a ValueError exception if required is missing
    @param validate: Set to true to cause checking to occur.  Runs slower.  FIX: not implemented.
    @rtype: BitVector
    @return: encoded binary message (for binary messages, this needs to be wrapped in a msg 8
    @note: The returned bits may not be 6 bit aligned.  It is up to you to pad out the bits.
    '''

    bvList = []
    bvList.append(binary.setBitVectorSize(BitVector(intVal=8), 6))
    if 'RepeatIndicator' in params:
        bvList.append(
            binary.setBitVectorSize(
                BitVector(intVal=params['RepeatIndicator']), 2))
    else:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=0), 2))
    bvList.append(
        binary.setBitVectorSize(BitVector(intVal=params['UserID']), 30))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=0), 2))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=366), 10))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=63), 6))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=1), 12))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['month']),
                                          4))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['day']), 5))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['hour']), 5))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['min']), 6))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['sec']), 6))
    if 'stationid' in params:
        bvList.append(aisstring.encode(params['stationid'], 42))
    else:
        bvList.append(aisstring.encode('@@@@@@@', 42))
    if 'longitude' in params:
        bvList.append(
            binary.bvFromSignedInt(
                int(Decimal(params['longitude']) * Decimal('600000')), 28))
    else:
        bvList.append(binary.bvFromSignedInt(108600000, 28))
    if 'latitude' in params:
        bvList.append(
            binary.bvFromSignedInt(
                int(Decimal(params['latitude']) * Decimal('600000')), 27))
    else:
        bvList.append(binary.bvFromSignedInt(54600000, 27))
    if 'timetoexpire' in params:
        bvList.append(
            binary.setBitVectorSize(BitVector(intVal=params['timetoexpire']),
                                    16))
    else:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=0), 16))
    if 'radius' in params:
        bvList.append(
            binary.setBitVectorSize(BitVector(intVal=params['radius']), 16))
    else:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=65534), 16))

    return binary.joinBV(bvList)
Example #20
0
def encode(params, validate=False):
    '''Create a bsreport binary message payload to pack into an AIS Msg bsreport.

    Fields in params:
      - MessageID(uint): AIS message number.  Must be 4 (field automatically set to "11")
      - RepeatIndicator(uint): Indicated how many times a message has been repeated
      - UserID(uint): Unique ship identification number (MMSI)
      - Time_year(uint): Current time stamp  year 1-9999
      - Time_month(uint): Current time stamp  month 1..12
      - Time_day(uint): Current time stamp  day of the month 1..31
      - Time_hour(uint): Current time stamp  UTC hours 0..23
      - Time_min(uint): Current time stamp  minutes
      - Time_sec(uint): Current time stamp  seconds
      - PositionAccuracy(uint): Accuracy of positioning fixes
      - Position_longitude(decimal): Location of base station  East West location
      - Position_latitude(decimal): Location of base station  North South location
      - fixtype(uint): Method used for positioning
      - Spare(uint): Not used.  Should be set to zero. (field automatically set to "0")
      - RAIM(bool): Receiver autonomous integrity monitoring flag
      - state_syncstate(uint): Communications State - SOTDMA  Sycronization state
      - state_slottimeout(uint): Communications State - SOTDMA  Frames remaining until a new slot is selected
      - state_slotoffset(uint): Communications State - SOTDMA  In what slot will the next transmission occur. BROKEN
    @param params: Dictionary of field names/values.  Throws a ValueError exception if required is missing
    @param validate: Set to true to cause checking to occur.  Runs slower.  FIX: not implemented.
    @rtype: BitVector
    @return: encoded binary message (for binary messages, this needs to be wrapped in a msg 8
    @note: The returned bits may not be 6 bit aligned.  It is up to you to pad out the bits.
    '''

    bvList = []
    bvList.append(binary.setBitVectorSize(BitVector(intVal=11),6))
    if 'RepeatIndicator' in params:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=params['RepeatIndicator']),2))
    else:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=0),2))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['UserID']),30))
    if 'Time_year' in params:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=params['Time_year']),14))
    else:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=0),14))
    if 'Time_month' in params:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=params['Time_month']),4))
    else:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=0),4))
    if 'Time_day' in params:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=params['Time_day']),5))
    else:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=0),5))
    if 'Time_hour' in params:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=params['Time_hour']),5))
    else:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=24),5))
    if 'Time_min' in params:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=params['Time_min']),6))
    else:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=60),6))
    if 'Time_sec' in params:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=params['Time_sec']),6))
    else:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=60),6))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['PositionAccuracy']),1))
    if 'Position_longitude' in params:
        bvList.append(binary.bvFromSignedInt(int(Decimal(params['Position_longitude'])*Decimal('600000')),28))
    else:
        bvList.append(binary.bvFromSignedInt(108600000,28))
    if 'Position_latitude' in params:
        bvList.append(binary.bvFromSignedInt(int(Decimal(params['Position_latitude'])*Decimal('600000')),27))
    else:
        bvList.append(binary.bvFromSignedInt(54600000,27))
    if 'fixtype' in params:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=params['fixtype']),4))
    else:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=0),4))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=0),10))
    if params["RAIM"]: bvList.append(TrueBV)
    else: bvList.append(FalseBV)
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['state_syncstate']),2))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['state_slottimeout']),3))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['state_slotoffset']),14))

    return binary.joinBV(bvList)
Example #21
0
def encode(params, validate=False):
    '''Create a waterlevel binary message payload to pack into an AIS Msg waterlevel.

    Fields in params:
      - MessageID(uint): AIS message number.  Must be 8 (field automatically set to "8")
      - RepeatIndicator(uint): Indicated how many times a message has been repeated
      - UserID(uint): Unique ship identification number (MMSI)
      - Spare(uint): Reserved for definition by a regional authority. (field automatically set to "0")
      - dac(uint): Designated Area Code (field automatically set to "366")
      - fid(uint): Functional Identifier (field automatically set to "63")
      - month(uint): Time the measurement represents  month 1..12
      - day(uint): Time the measurement represents  day of the month 1..31
      - hour(uint): Time the measurement represents  UTC hours 0..23
      - min(uint): Time the measurement represents  minutes
      - stationid(aisstr6): Character identifier of the station.  Usually a number.
      - waterlevel(int): Water level in centimeters
      - datum(uint): What reference datum applies to the value
      - sigma(uint): Standard deviation of 1 second samples used to compute the water level height.  FIX: is this the correct description of sigma?
      - source(uint): How the water level was derived
    @param params: Dictionary of field names/values.  Throws a ValueError exception if required is missing
    @param validate: Set to true to cause checking to occur.  Runs slower.  FIX: not implemented.
    @rtype: BitVector
    @return: encoded binary message (for binary messages, this needs to be wrapped in a msg 8
    @note: The returned bits may not be 6 bit aligned.  It is up to you to pad out the bits.
    '''

    bvList = []
    bvList.append(binary.setBitVectorSize(BitVector(intVal=8), 6))
    if 'RepeatIndicator' in params:
        bvList.append(
            binary.setBitVectorSize(
                BitVector(intVal=params['RepeatIndicator']), 2))
    else:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=0), 2))
    bvList.append(
        binary.setBitVectorSize(BitVector(intVal=params['UserID']), 30))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=0), 2))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=366), 10))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=63), 6))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['month']),
                                          4))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['day']), 5))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['hour']), 5))
    bvList.append(binary.setBitVectorSize(BitVector(intVal=params['min']), 6))
    if 'stationid' in params:
        bvList.append(aisstring.encode(params['stationid'], 42))
    else:
        bvList.append(aisstring.encode('@@@@@@@', 42))
    if 'waterlevel' in params:
        bvList.append(binary.bvFromSignedInt(params['waterlevel'], 16))
    else:
        bvList.append(binary.bvFromSignedInt(-32768, 16))
    if 'datum' in params:
        bvList.append(
            binary.setBitVectorSize(BitVector(intVal=params['datum']), 5))
    else:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=31), 5))
    if 'sigma' in params:
        bvList.append(
            binary.setBitVectorSize(BitVector(intVal=params['sigma']), 7))
    else:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=127), 7))
    if 'source' in params:
        bvList.append(
            binary.setBitVectorSize(BitVector(intVal=params['source']), 3))
    else:
        bvList.append(binary.setBitVectorSize(BitVector(intVal=0), 3))

    return binary.joinBV(bvList)