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 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 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 get_bits(self, include_bin_hdr=True, mmsi=None, include_dac_fi=True): 'Child classes must implement this' bv_list = [] if include_bin_hdr: bv_list.append( BitVector(intVal=8, size=6) ) # Messages ID bv_list.append( BitVector(size=2) ) # Repeat Indicator if mmsi is None and self.source_mmsi is None: raise AisPackingException('No mmsi specified') if mmsi is None: mmsi = self.source_mmsi bv_list.append( BitVector(intVal=mmsi, size=30) ) #sys.stderr.write('\nlen: a %d\n'% len(binary.joinBV(bv_list))) if include_bin_hdr or include_dac_fi: bv_list.append( BitVector(size=2) ) # Should this be here or in the bin_hdr? bv_list.append( BitVector(intVal=self.dac, size=10 ) ) bv_list.append( BitVector(intVal=self.fi, size=6 ) ) #sys.stderr.write('len: %d\n'% len(binary.joinBV(bv_list))) bv_list.append( binary.bvFromSignedInt(int(self.lon * 60000), 25)), bv_list.append( binary.bvFromSignedInt(int(self.lat * 60000), 24)), bv_list.append( BitVector(intVal=self.pos_acc, size=1) ) bv_list.append( BitVector(intVal=self.day, size=5) ) bv_list.append( BitVector(intVal=self.hour, size=5) ) bv_list.append( BitVector(intVal=self.minute, size=6) ) bv_list.append( BitVector(intVal=self.wind, size=7) ) bv_list.append( BitVector(intVal=self.gust, size=7) ) bv_list.append( BitVector(intVal=self.wind_dir, size=9) ) bv_list.append( BitVector(intVal=self.gust_dir, size=9) ) bv_list.append( binary.bvFromSignedInt(int(round(self.air_temp*10)), 11)), bv_list.append( BitVector(intVal=self.humid, size=7) ) bv_list.append( binary.bvFromSignedInt(int(round(self.dew*10)), 10)), bv_list.append( BitVector(intVal=self.air_pres - 799, size=9) ) bv_list.append( BitVector(intVal=self.air_pres_trend, size=2) ) bv_list.append( BitVector(intVal=int(round(self.vis*10)), size=8) ) # FIX: double check wl bv_list.append( BitVector(intVal=int(round((self.wl+10)*100)), size=12) ) bv_list.append( BitVector(intVal=self.wl_trend, size=2) ) bv_list.append( BitVector(intVal=int(round(self.cur[0]['speed']*10)), size=8) ) bv_list.append( BitVector(intVal=self.cur[0]['dir'], size=9) ) for i in (1,2): bv_list.append( BitVector(intVal=int(round(self.cur[i]['speed']*10)), size=8) ) bv_list.append( BitVector(intVal=self.cur[i]['dir'], size=9) ) bv_list.append( BitVector(intVal=self.cur[i]['level'], size=5) ) bv_list.append( BitVector(intVal=int(round(self.wave_height*10)), size=8) ) bv_list.append( BitVector(intVal=self.wave_period, size=6) ) bv_list.append( BitVector(intVal=self.wave_dir, size=9) ) bv_list.append( BitVector(intVal=int(round(self.swell_height*10)), size=8) ) bv_list.append( BitVector(intVal=self.swell_period, size=6) ) bv_list.append( BitVector(intVal=self.swell_dir, size=9) ) bv_list.append( BitVector(intVal=self.sea_state, size=4) ) bv_list.append( binary.bvFromSignedInt(int(round(self.water_temp*10)), 10)), bv_list.append( BitVector(intVal=self.precip, size=3) ) bv_list.append( BitVector(intVal=int(round(self.salinity*10)), size=9) ) bv_list.append( BitVector(intVal=self.ice, size=2) ) bv_list.append( BitVector(size=10) ) bv = binary.joinBV(bv_list) if len(bv) != MSG_SIZE: sys.stderr.write('MetHydro31 wrong size: %d WANT: %d\n' %(len(bv), MSG_SIZE)) raise AisPackingException('message wrong size. Need %d bits, but can only use %d bits' % (MSG_SIZE,len(bv)) ) return bv
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 23 (field automatically set to "23") - 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") - 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 - StationType(uint): TODO - shipandcargo(uint): what - Spare2(uint): Not used. Should be set to zero. (field automatically set to "0") - TxRxMode(uint): TODO - ReportingInterval(uint): Command the stations to report as given in table 17 - QuietTime(uint): How long to be quiet - Spare3(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=23),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 '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['StationType']),4)) if 'shipandcargo' in params: bvList.append(binary.setBitVectorSize(BitVector(intVal=params['shipandcargo']),8)) else: bvList.append(binary.setBitVectorSize(BitVector(intVal=0),8)) bvList.append(binary.setBitVectorSize(BitVector(intVal=0),22)) bvList.append(binary.setBitVectorSize(BitVector(intVal=params['TxRxMode']),4)) bvList.append(binary.setBitVectorSize(BitVector(intVal=params['ReportingInterval']),4)) bvList.append(binary.setBitVectorSize(BitVector(intVal=params['QuietTime']),22)) bvList.append(binary.setBitVectorSize(BitVector(intVal=0),6)) return binary.joinBV(bvList)
def encode(params, validate=False): '''Create a positionb binary message payload to pack into an AIS Msg positionb. Fields in params: - MessageID(uint): AIS message number. Must be 18 (field automatically set to "18") - RepeatIndicator(uint): Indicated how many times a message has been repeated - UserID(uint): Unique ship identification number (MMSI) - Reserved1(uint): Reseverd for definition by a compentent regional or local authority. Should be set to zero. (field automatically set to "0") - SOG(udecimal): Speed over ground - PositionAccuracy(uint): Accuracy of positioning fixes - longitude(decimal): Location of the vessel East West location - latitude(decimal): Location of the vessel North South location - COG(udecimal): Course over ground - TrueHeading(uint): True heading (relative to true North) - TimeStamp(uint): UTC second when the report was generated - Spare(uint): Not used. Should be set to zero. (field automatically set to "0") - cs_unit(bool): Does this unit do Carrier Sense? - display_flag(bool): Does this class B unit have an integrated display? - dsc_flag(bool): Does it have dedicated or time-shared DSC radio function? - band_flag(bool): How flexible is the freq handling of the unit? - msg22_flag(bool): Can the unit handle msg 22? - mode_flag(bool): Assigned mode wrt to VDL slots - RAIM(bool): Receiver autonomous integrity monitoring flag - CommStateSelector(uint): SOTDMA or ITDMA - CommState(uint): Not decoded by this software yet @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=18),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),8)) if 'SOG' in params: bvList.append(binary.setBitVectorSize(BitVector(intVal=int((Decimal(params['SOG'])*Decimal('10')))),10)) else: bvList.append(binary.setBitVectorSize(BitVector(intVal=int(1023)),10)) bvList.append(binary.setBitVectorSize(BitVector(intVal=params['PositionAccuracy']),1)) 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 'COG' in params: bvList.append(binary.setBitVectorSize(BitVector(intVal=int((Decimal(params['COG'])*Decimal('10')))),12)) else: bvList.append(binary.setBitVectorSize(BitVector(intVal=int(3600)),12)) if 'TrueHeading' in params: bvList.append(binary.setBitVectorSize(BitVector(intVal=params['TrueHeading']),9)) else: bvList.append(binary.setBitVectorSize(BitVector(intVal=511),9)) if 'TimeStamp' in params: bvList.append(binary.setBitVectorSize(BitVector(intVal=params['TimeStamp']),6)) else: bvList.append(binary.setBitVectorSize(BitVector(intVal=60),6)) bvList.append(binary.setBitVectorSize(BitVector(intVal=0),2)) if params["cs_unit"]: bvList.append(TrueBV) else: bvList.append(FalseBV) if params["display_flag"]: bvList.append(TrueBV) else: bvList.append(FalseBV) if params["dsc_flag"]: bvList.append(TrueBV) else: bvList.append(FalseBV) if params["band_flag"]: bvList.append(TrueBV) else: bvList.append(FalseBV) if params["msg22_flag"]: bvList.append(TrueBV) else: bvList.append(FalseBV) if params["mode_flag"]: bvList.append(TrueBV) else: bvList.append(FalseBV) if params["RAIM"]: bvList.append(TrueBV) else: bvList.append(FalseBV) bvList.append(binary.setBitVectorSize(BitVector(intVal=params['CommStateSelector']),1)) bvList.append(binary.setBitVectorSize(BitVector(intVal=params['CommState']),19)) return binary.joinBV(bvList)
def AddInt(self, val, num_bits): """Add a signed integer.""" bits = binary.bvFromSignedInt(int(val), num_bits) assert num_bits == len(bits) self.bits_expected += num_bits self.bv_list.append(bits)
def encode(params, validate=False): '''Create a position binary message payload to pack into an AIS Msg position. Fields in params: - MessageID(uint): AIS message number. Must be 1 (field automatically set to "1") - RepeatIndicator(uint): Indicated how many times a message has been repeated - UserID(uint): Unique ship identification number (MMSI) - NavigationStatus(uint): What is the vessel doing - ROT(int): RateOfTurn - SOG(udecimal): Speed over ground - PositionAccuracy(uint): Accuracy of positioning fixes - longitude(decimal): Location of the vessel East West location - latitude(decimal): Location of the vessel North South location - COG(udecimal): Course over ground - TrueHeading(uint): True heading (relative to true North) - TimeStamp(uint): UTC second when the report was generated - RegionalReserved(uint): Reserved for definition by a regional authority. (field automatically set to "0") - 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=1),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 'NavigationStatus' in params: bvList.append(binary.setBitVectorSize(BitVector(intVal=params['NavigationStatus']),4)) else: bvList.append(binary.setBitVectorSize(BitVector(intVal=15),4)) if 'ROT' in params: bvList.append(binary.bvFromSignedInt(params['ROT'],8)) else: bvList.append(binary.bvFromSignedInt(-128,8)) if 'SOG' in params: bvList.append(binary.setBitVectorSize(BitVector(intVal=int((Decimal(params['SOG'])*Decimal('10')))),10)) else: bvList.append(binary.setBitVectorSize(BitVector(intVal=int(1023)),10)) bvList.append(binary.setBitVectorSize(BitVector(intVal=params['PositionAccuracy']),1)) 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 'COG' in params: bvList.append(binary.setBitVectorSize(BitVector(intVal=int((Decimal(params['COG'])*Decimal('10')))),12)) else: bvList.append(binary.setBitVectorSize(BitVector(intVal=int(3600)),12)) if 'TrueHeading' in params: bvList.append(binary.setBitVectorSize(BitVector(intVal=params['TrueHeading']),9)) else: bvList.append(binary.setBitVectorSize(BitVector(intVal=511),9)) if 'TimeStamp' in params: bvList.append(binary.setBitVectorSize(BitVector(intVal=params['TimeStamp']),6)) else: bvList.append(binary.setBitVectorSize(BitVector(intVal=60),6)) bvList.append(binary.setBitVectorSize(BitVector(intVal=0),4)) bvList.append(binary.setBitVectorSize(BitVector(intVal=0),1)) 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 decimal_enc(val,bitSize): '''@rtype: BitVector''' # FIX: make sure there is no remainder return binary.bvFromSignedInt(int(val),bitSize)
def int_enc(val,bitSize): '''@rtype: BitVector''' 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 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 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)