1515 InvalidDataTypeException , MissingPayloadException
1616from pyais .util import checksum , decode_into_bit_array , compute_checksum , get_itdma_comm_state , get_sotdma_comm_state , int_to_bin , str_to_bin , \
1717 encode_ascii_6 , from_bytes , from_bytes_signed , decode_bin_as_ascii6 , get_int , chk_to_int , coerce_val , \
18- bits2bytes , bytes2bits , b64encode_str
18+ bits2bytes , bytes2bits , b64encode_str , is_auxiliary_craft
1919
2020NMEA_VALUE = typing .Union [str , float , int , bool , bytes ]
2121
@@ -1701,6 +1701,32 @@ class MessageType24PartB(Payload):
17011701 spare_1 = bit_field (6 , bytes , default = b'' , is_spare = True )
17021702
17031703
1704+ @attr .s (slots = True )
1705+ class MessageType24PartBAuxiliaryCraft (Payload ):
1706+ """
1707+ Static Data Report - Part B (Auxiliary Craft Variant)
1708+
1709+ When the MMSI follows the pattern 98XXXYYYY (auxiliary craft),
1710+ bits 132-161 contain the mothership MMSI instead of vessel dimensions.
1711+
1712+ See ITU-R M.1371-5 for specification details.
1713+ """
1714+ msg_type = bit_field (6 , int , default = 24 , signed = False )
1715+ repeat = bit_field (2 , int , default = 0 , signed = False )
1716+ mmsi = bit_field (30 , int , from_converter = from_mmsi )
1717+
1718+ partno = bit_field (2 , int , default = 0 , signed = False )
1719+ ship_type = bit_field (8 , int , default = 0 , signed = False )
1720+ vendorid = bit_field (18 , str , default = '' , signed = False )
1721+ model = bit_field (4 , int , default = 0 , signed = False )
1722+ serial = bit_field (20 , int , default = 0 , signed = False )
1723+ callsign = bit_field (42 , str , default = '' )
1724+
1725+ mothership_mmsi = bit_field (30 , int , from_converter = from_mmsi )
1726+
1727+ spare_1 = bit_field (6 , bytes , default = b'' , is_spare = True )
1728+
1729+
17041730class MessageType24 (Payload ):
17051731 """
17061732 Static Data Report
@@ -1714,20 +1740,26 @@ class MessageType24(Payload):
17141740
17151741 @classmethod
17161742 def create (cls , ** kwargs : typing .Union [str , float , int , bool , bytes ]) -> "ANY_MESSAGE" :
1743+ mmsi : int = int (kwargs .get ('mmsi' , 0 ))
17171744 partno : int = int (kwargs .get ('partno' , 0 ))
17181745 if partno == 0 :
17191746 return MessageType24PartA .create (** kwargs )
17201747 elif partno == 1 :
1748+ if is_auxiliary_craft (mmsi ):
1749+ return MessageType24PartBAuxiliaryCraft .create (** kwargs )
17211750 return MessageType24PartB .create (** kwargs )
17221751 else :
17231752 raise UnknownPartNoException (f"Partno { partno } is not allowed!" )
17241753
17251754 @classmethod
17261755 def from_bitarray (cls , bit_arr : bitarray ) -> "ANY_MESSAGE" :
1756+ mmsi : int = get_int (bit_arr , 8 , 38 )
17271757 partno : int = get_int (bit_arr , 38 , 40 )
17281758 if partno == 0 :
17291759 return MessageType24PartA .from_bitarray (bit_arr )
17301760 elif partno == 1 :
1761+ if is_auxiliary_craft (mmsi ):
1762+ return MessageType24PartBAuxiliaryCraft .from_bitarray (bit_arr )
17311763 return MessageType24PartB .from_bitarray (bit_arr )
17321764 else :
17331765 raise UnknownPartNoException (f"Partno { partno } is not allowed!" )
0 commit comments