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)
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)
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)
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)
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)
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)
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)
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)
def decimal_enc(val, bitSize): '''@rtype: BitVector''' # FIX: make sure there is no remainder return binary.bvFromSignedInt(int(val), bitSize)
def float_enc(val, bitSize): '''@rtype: BitVector''' bv = binary.bvFromSignedInt(int(val), bitSize) return binary.setBitVectorSize(bv, bitSize)
def int_enc(val,bitSize): '''@rtype: BitVector''' return binary.bvFromSignedInt(int(val),bitSize)
def int_enc(val, bitSize): '''@rtype: BitVector''' return binary.bvFromSignedInt(int(val), bitSize)
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)
def decimal_enc(val,bitSize): '''@rtype: BitVector''' # FIX: make sure there is no remainder return binary.bvFromSignedInt(int(val),bitSize)
def float_enc(val,bitSize): '''@rtype: BitVector''' bv = binary.bvFromSignedInt(int(val),bitSize) return binary.setBitVectorSize(bv,bitSize)
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)
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)
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)
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)
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)