Esempio n. 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)
Esempio n. 2
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)
Esempio n. 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)
Esempio n. 4
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)
    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
Esempio n. 6
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 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)
Esempio n. 7
0
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)
Esempio n. 8
0
 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)
Esempio n. 9
0
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)
Esempio n. 10
0
def decimal_enc(val,bitSize):
    '''@rtype: BitVector'''
    # FIX: make sure there is no remainder
    return binary.bvFromSignedInt(int(val),bitSize)
Esempio n. 11
0
def int_enc(val,bitSize):
    '''@rtype: BitVector'''
    return binary.bvFromSignedInt(int(val),bitSize)
Esempio n. 12
0
def float_enc(val,bitSize):
    '''@rtype: BitVector'''
    bv = binary.bvFromSignedInt(int(val),bitSize)
    return binary.setBitVectorSize(bv,bitSize)
Esempio n. 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)
Esempio n. 14
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)