def vesselIDfill(self, deduct_offset, bits): self.vesselID = bits[0:3] self.tablebin.append([ self.bitlabel(91, 93, deduct_offset), self.vesselID, 'Vessel ID Type', Func.getVesselid(self.vesselID) ]) ############################################## # Vessel 0: No aircraft or maritime identity # ############################################## if self.vesselID == '000': if Func.checkzeros(bits[3:47]): self.tablebin.append([ self.bitlabel(94, 137, deduct_offset), bits[3:47], 'Vessel ID type is none', 'All 0 - OK' ]) else: self.tablebin.append([ self.bitlabel(94, 137, deduct_offset), bits[3:47], 'Vessel ID type is none', 'Error! Should be all 0' ]) ########################### # Vessel 1: Maritime MMSI # ########################### elif self.vesselID == '001': self.mmsi = Func.bin2dec(bits[3:33]) if self.mmsi == 111111: self.tablebin.append([ self.bitlabel(94, 123, deduct_offset), bits[3:33], 'MMSI:', 'No MMSI available' ]) else: self.mmsi_string = str(self.mmsi).zfill(9) self.tablebin.append([ self.bitlabel(94, 123, deduct_offset), bits[3:33], 'Unique ship station identity MIDxxYYYY:', self.mmsi_string ]) self.mmsi_country = Func.countryname(int( self.mmsi_string[0:3])) self.tablebin.append([ '', '', 'Flag state of vessel:', self.mmsi_string[0:3] + ' ' + self.mmsi_country ]) self.tablebin.append( ['', '', 'Unique vessel number', self.mmsi_string[3:]]) self.epirb_ais = Func.bin2dec(bits[33:47]) if self.epirb_ais == 10922: self.tablebin.append([ self.bitlabel(124, 137, deduct_offset), bits[33:47], 'EPIRB-AIS System Identity:', 'No EPIRB-AIS System' ]) else: self.epirb_ais_str = str(self.epirb_ais).zfill(4) self.epirb_ais_str = '974xx' + self.epirb_ais_str self.tablebin.append([ self.bitlabel(124, 137, deduct_offset), bits[33:47], 'EPIRB-AIS System Identity', self.epirb_ais_str ]) ############################# # Vessel 2: Radio Call Sign # ############################# elif self.vesselID == '010': self.callsign = Func.getCallsign(bits[3:45]) self.tablebin.append([ self.bitlabel(94, 135, deduct_offset), bits[3:45], 'Radio Callsign', self.callsign ]) if Func.checkzeros(bits[45:47]): status_check = 'OK' else: status_check = 'ERROR' self.tablebin.append([ self.bitlabel(136, 137, deduct_offset), bits[45:47], 'Spare should be 0', status_check ]) ######################################################### # Vessel 3: Aricraft Registration Marking (Tail Number) # ######################################################### elif self.vesselID == '011': self.tailnum = Func.getTailNum(bits[3:45]) self.tablebin.append([ self.bitlabel(94, 135, deduct_offset), bits[3:45], 'Aircraft Registration Marking:', self.tailnum ]) if bits[45:47] == '00': status_check = 'OK' else: status_check = 'ERROR' self.tablebin.append([ self.bitlabel(136, 137, deduct_offset), bits[45:47], 'Spare should be 0', status_check ]) ############################################## # Vessel 4: Aircraft Aviation 24 Bit Address # ############################################## elif self.vesselID == '100': self.aviationBitAddress = Func.bin2dec(bits[3:27]) self.tablebin.append([ self.bitlabel(94, 117, deduct_offset), bits[3:27], 'Aviation 24 bit address', str(self.aviationBitAddress) ]) if Func.checkzeros(bits[27:47]): status_check = 'OK' else: status_check = 'ERROR' self.tablebin.append([ self.bitlabel(118, 137, deduct_offset), bits[27:47], 'Spare should be 0', status_check ]) ################################################# # Vessel 5: Aircraft Operator and Serial Number # ################################################# elif self.vesselID == '101': self.operator = Func.baudot2str(bits[3:21], 3) self.serialnum = Func.bin2dec(bits[21:33]) self.tablebin.append([ self.bitlabel(94, 111, deduct_offset), bits[3:21], 'Aircraft operator:', self.operator ]) self.tablebin.append([ self.bitlabel(112, 123, deduct_offset), bits[21:33], 'Serial number:', str(self.serialnum) ]) if Func.checkones(bits[33:47]): status_check = 'OK' else: status_check = 'ERROR' self.tablebin.append([ self.bitlabel(124, 137, deduct_offset), bits[33:47], 'Spare all should be 1', status_check ])
def processHex(self, strhex): ##All second generation beacon messages must be EXACTLY 250 bits ##in length for the program to function properly. self.bits = Func.hex2bin(strhex) if len(self.bits) == 250 or len(self.bits) == 202: self.tablebin = [] self.rotatingbin = [] ##Add an additional bit to ensure that bits in array line up with bits in documentation self.bits = "0" + self.bits ##BIT 1-20 Type Approval Certificate # self.tac = Func.bin2dec(self.bits[1:21]) self.tablebin.append([ '1-20', self.bits[1:21], 'Type Approval Certificate #:', str(self.tac) ]) ##BIT 21-30 Serial Number self.serialNum = Func.bin2dec(self.bits[21:31]) self.tablebin.append([ '21-30', self.bits[21:31], 'Serial Number:', str(self.serialNum) ]) ##BIT 31-40 Country code self.countryCode = Func.bin2dec(self.bits[31:41]) self.countryName = Func.countryname(self.countryCode) self.tablebin.append([ '31-40', self.bits[31:41], 'Country code:', str(self.countryCode) + ' ' + str(self.countryName) ]) ##BIT 41 Status of homing device self.status = Func.homing(self.bits[41]) self.tablebin.append( ['41', self.bits[41], 'Status of homing device:', self.status]) ##BIT 42 Self-test function self.selfTestStatus = Func.selfTest(self.bits[42]) self.tablebin.append([ '42', self.bits[42], 'Self-test function:', self.selfTestStatus ]) ##BIT 43 User cancellation self.cancel = Func.cancellation(self.bits[43]) self.tablebin.append( ['43', self.bits[43], 'User cancellation:', self.cancel]) ##BIT 44-90 Encoded GNSS location self.latitude = Func.getlatitude(self.bits[44:67]) self.tablebin.append( ['44-66', self.bits[44:67], 'Latitude:', self.latitude[0]]) self.longitude = Func.getlongitude(self.bits[67:91]) self.tablebin.append( ['67-90', self.bits[67:91], 'Longitude:', self.longitude[0]]) self.location = (self.latitude[1], self.longitude[1]) ################################ # # # BIT 91-137 VESSEL ID FIELD # # # ################################ self.vesselID = self.bits[91:94] ############################################## # Vessel 0: No aircraft or maritime identity # ############################################## if self.vesselID == '000': self.tablebin.append([ '91-93', self.bits[91:94], 'Vessel ID:', 'No aircraft or maritime identity' ]) if Func.checkzeros(self.bits[94:138]): self.tablebin.append( ['94-137', self.bits[94:138], 'Spare:', 'All 0 - OK']) else: self.tablebin.append([ '94-137', self.bits[94:138], 'Spare:', 'ERROR: Bits 94-137 should be 0' ]) ########################### # Vessel 1: Maritime MMSI # ########################### elif self.vesselID == '001': self.tablebin.append( ['91-93', self.bits[91:94], 'Vessel ID:', 'MMSI']) self.mmsi = Func.bin2dec(self.bits[94:124]) if self.mmsi == 111111: self.tablebin.append([ '94-123', self.bits[94:124], 'MMSI:', 'No MMSI available' ]) else: self.mmsi_string = str(self.mmsi).zfill(9) self.tablebin.append([ '94-123', self.bits[94:124], 'Unique ship station identity M1I2D3X4X5X6X7X8X9:', self.mmsi_string ]) self.mmsi_country = Func.countryname( int(self.mmsi_string[0:3])) self.tablebin.append([ '', '', 'Flag state of vessel:', self.mmsi_string[0:3] + ' ' + self.mmsi_country ]) self.tablebin.append([ '', '', 'Unique vessel number:', self.mmsi_string[3:] ]) self.epirb_ais = Func.bin2dec(self.bits[124:138]) if self.epirb_ais == 10922: self.tablebin.append([ '124-137', self.bits[124:138], 'EPIRB-AIS System Identity:', 'No EPIRB-AIS System' ]) else: self.epirb_ais_str = str(self.epirb_ais).zfill(4) self.epirb_ais_str = '974' + self.mmsi_string[ 3:5] + self.epirb_ais_str self.tablebin.append([ '124-137', self.bits[123:137], 'EPIRB-AIS System Identity:', self.epirb_ais_str ]) ############################# # Vessel 2: Radio Call Sign # ############################# elif self.vesselID == '010': self.tablebin.append([ '91-93', self.bits[91:94], 'Vessel ID:', 'Radio Call Sign' ]) self.callsign = Func.getCallsign(self.bits[94:136]) self.tablebin.append([ '94-135', self.bits[94:136], 'Radio Callsign:', self.callsign ]) if Func.checkzeros(self.bits[136:138]): self.tablebin.append([ '136-137', self.bits[136:138], 'Spare:', 'All 0 - OK' ]) else: self.tablebin.append([ '136-137', self.bits[136:138], 'Spare:', 'ERROR: Bits 136-137 should be all 0s' ]) ######################################################### # Vessel 3: Aricraft Registration Marking (Tail Number) # ######################################################### elif self.vesselID == '011': self.tablebin.append([ '91-93', self.bits[91:94], 'Vessel ID:', 'Aircraft Registration Marking (Tail Number)' ]) self.tailnum = Func.getTailNum(self.bits[94:136]) self.tablebin.append([ '94-135', self.bits[94:136], 'Aircraft Registration Marking:', self.tailnum ]) if Func.checkzeros(self.bits[135:137]): self.tablebin.append( ['136-137', self.bits[136:138], 'Spare:', 'OK']) else: self.tablebin.append([ '136-137', self.bits[136:138], 'Spare:', 'ERROR: Bits 136-137 should be all 0s' ]) ############################################## # Vessel 4: Aircraft Aviation 24 Bit Address # ############################################## elif self.vesselID == '100': self.tablebin.append([ '91-93', self.bits[91:94], 'Vessel ID:', 'Aircraft Aviation 24 Bit Address' ]) self.aviationBitAddress = Func.bin2dec(self.bits[93:117]) self.tablebin.append([ '94-117', self.bits[94:118], 'Aviation 24 bit address:', str(self.aviationBitAddress) ]) if Func.checkzeros(self.bits[117:137]): self.tablebin.append( ['118-137', self.bits[118:138], 'Spare:', 'OK']) else: self.tablebin.append([ '118-137', self.bits[118:138], 'Spare:', 'ERROR: Bits 118-137 following aviation 24 bit address should be 0' ]) ################################################# # Vessel 5: Aircraft Operator and Serial Number # ################################################# elif self.vesselID == '101': self.tablebin.append([ '91-93', self.bits[91:94], 'Vessel ID:', 'Aircraft Operator and Serial Number' ]) self.operator = Func.baudot2str(self.bits[94:112], 3) self.serialnum = Func.bin2dec(self.bits[112:124]) self.tablebin.append([ '94-111', self.bits[94:112], 'Aircraft operator:', self.operator ]) self.tablebin.append([ '112-123', self.bits[112:124], 'Serial number:', str(self.serialnum) ]) if Func.checkones(self.bits[124:138]): self.tablebin.append( ['124-137', self.bits[124:138], 'Spare:', 'OK']) else: self.tablebin.append([ '124-137', self.bits[124:138], 'Spare:', 'ERROR: Bits 124-137 following aircraft operator and serial numbers should be 1' ]) ########################## # Other Vessel IDs Spare # ########################## else: self.tablebin.append( ['91-93', self.bits[91:94], 'Vessel ID:', 'Spare']) ##BIT 138-154 Spare bits [137-153] if Func.checkones(self.bits[138:155]): self.tablebin.append( ['138-154', self.bits[138:155], 'Spare:', 'OK']) else: self.tablebin.append([ '138-154', self.bits[138:155], 'Spare:', 'ERROR: Bits 138-154 should be 1s' ]) ####################################### # # # BIT 155-202 48 BIT ROTATING FIELD # # # ####################################### self.rotatingID = Func.bin2dec(self.bits[155:159]) ###################################################### # Rotating Field 0: C/S G.008 Objective Requirements # ###################################################### if self.rotatingID == 0: self.tablebin.append([ '155-158 (Rotating field 1-4)', self.bits[155:159], 'Rotating Field Type:', '(#0) C/S G.008 Objective Requirements' ]) self.rotatingbin = rotating.rotating0(self.bits[155:203]) ######################################## # Rotating Field 1: Inflight Emergency # ######################################## elif self.rotatingID == 1: self.tablebin.append([ '155-158 (Rotating field 1-4)', self.bits[155:159], 'Rotating Field Type:', '(#1) Inflight Emergency' ]) self.rotatingbin = rotating.rotating1(self.bits[155:203]) ######################### # Rotating Field 2: RLS # ######################### elif self.rotatingID == 2: self.tablebin.append([ '155-158 (Rotating field 1-4)', self.bits[155:159], 'Rotating Field Type:', '(#2) RLS' ]) self.rotatingbin = rotating.rotating2(self.bits[155:203]) ################################## # Rotating Field 3: National Use # ################################## elif self.rotatingID == 3: self.tablebin.append([ '155-158 (Rotating field 1-4)', self.bits[155:159], 'Rotating Field Type:', '(#3) National Use' ]) self.rotatingbin = rotating.rotating3(self.bits[155:203]) ########################################### # Rotating Field 15: Cancellation Message # ########################################### elif self.rotatingID == 15: self.tablebin.append([ '155-158 (Rotating field 1-4)', self.bits[155:159], 'Rotating Field Type:', '(#15) Cancellation Message' ]) self.rotatingbin = rotating.rotating15(self.bits[155:203]) ################################## # All other roating fields spare # ################################## else: self.tablebin.append([ '155-158 (Rotating field 1-4)', self.bits[155:159], 'Rotating Field Type:', 'Spare' ]) ##Add rotating field data to our list self.tablebin.extend(self.rotatingbin) #################### # BEACON 23 HEX ID # #################### self.hexID = [] ##Hex ID BIT 1 = fixed binary 1 self.hexID.append('1') ##Hex ID BIT 2-11 = BITS 31-40 (C/S Country Code) self.hexID.append(self.bits[31:41]) ##Hex ID BIT 12 = fixed binary 1 self.hexID.append('1') ##Hex ID BIT 13 = fixed binary 0 self.hexID.append('0') ##Hex ID BIT 14 = fixed binary 1 self.hexID.append('1') ##Hex ID BIT 15-34 = BITS 1-20 (C/S TAC No) self.hexID.append(self.bits[1:21]) ##Hex ID BIT 35-44 = BITS 21-30 (Beacon Serial Number) self.hexID.append(self.bits[21:31]) ##Hex ID BIT 45-47 = BITS 91-93 (Aircraft/Vessel ID Type) self.hexID.append(self.bits[91:94]) ##Hex ID BIT 48-91 = BITS 94-137 (Aircraft/Vessel ID) self.hexID.append(self.bits[94:138]) ##Hex ID BIT 92 = fixed binary 1 self.hexID.append('1') ##Join list together and convert to Hexadecimal self.beaconHexID = Func.bin2hex(''.join(self.hexID)) ##Add the 23 Hex ID to our table self.tablebin.append( ['', '', 'Beacon 23 Hex ID:', self.beaconHexID]) #################################### # 48-BIT BCH ERROR CORRECTING CODE # #################################### if len(self.bits) == 251: ##Calculate the BCH self.calculatedBCH = Func.calcBCH(self.bits[1:], 0, 202, 250) ##Compare to the BCH in the beacon message self.BCHerrors = Func.errors(self.calculatedBCH, self.bits[203:]) ##Write the number of errors to our table self.tablebin.append( ['', '', 'Number of BCH errors:', str(self.BCHerrors)]) else: self.type = ( 'Hex string length of ' + str(len(strhex)) + '.' + '\nBit string length of ' + str(len(self.bits)) + '.' + '\nLength of First Gen Beacon Hex String must be 15, 22 or 30' + '\nLength of Second Gen Beacon Bit String must be 250 bits') raise Gen2Error('LengthError', self.type)
################################################# # Vessel 5: Aircraft Operator and Serial Number # ################################################# elif vesselID == 5: print '\nVessel 5: Aircraft Operator and Serial Number' while next_step is False: operator = raw_input('\nPlease enter 3-letter aircraft operator designator: ') or ' ' if len(operator) != 3: print 'Error: aircraft operator designator must be 3 characters' else: operator_bits = Func2.str2baudot(operator).zfill(18) break printtxt('Operator Designator: {}\nbinary - {}\n'.format(Func2.baudot2str(operator_bits, 3),operator_bits)) while next_step is False: userInput = raw_input('\nPlease enter the serial number (1 to 4095) as designated by the aircraft operator: ') or '1' try: aircraft_serialnum = int(userInput) except ValueError: print 'Error: value must be an integer' aircraft_serialnum = 0 else: if aircraft_serialnum > 4095 or aircraft_serialnum < 1: print 'Error: invalid serial number' else: bits_aircraft_serialnum = Func1.dec2bin(aircraft_serialnum).zfill(12) break printtxt('Serial {}\nbinary - {}'.format(str(aircraft_serialnum),bits_aircraft_serialnum))
################################################# # Vessel 5: Aircraft Operator and Serial Number # ################################################# elif vesselID == 5: print '\nVessel 5: Aircraft Operator and Serial Number' while next_step is False: operator = raw_input('\nPlease enter 3-letter aircraft operator designator: ') if len(operator) != 3: print 'Error: aircraft operator designator must be 3 characters' else: operator_bits = Func2.str2baudot(operator).zfill(18) break print 'You entered: ' + Func2.baudot2str(operator_bits, 3) while next_step is False: userInput = raw_input('\nPlease enter the serial number (1 to 4095) as designated by the aircraft operator: ') try: aircraft_serialnum = int(userInput) except ValueError: print 'Error: value must be an integer' aircraft_serialnum = 0 else: if aircraft_serialnum > 4095 or aircraft_serialnum < 1: print 'Error: invalid serial number' else: bits_aircraft_serialnum = Func1.dec2bin(aircraft_serialnum).zfill(12) break print 'You entered: ' + str(Func1.bin2dec(bits_aircraft_serialnum))
def vesselIDfill(self,deduct_offset,bits): self.vesselID = bits[0:3] self.tablebin.append([self.bitlabel(91,93,deduct_offset), self.vesselID , 'Vessel ID Type', Func.getVesselid(self.vesselID)]) if self.vesselID == '111' and self.bits[43]=='0': self.tablebin.append(['','','Reserved for system testing','ERROR! Test protocol bit 43 is zero']) self.validhex=False ############################################## # Vessel 0: No aircraft or maritime identity # ############################################## if self.vesselID == '000': if Func.checkzeros(bits[3:47]): self.tablebin.append([self.bitlabel(94,137,deduct_offset), bits[3:47], 'Vessel ID type is none', 'All 0 - OK']) else: self.tablebin.append([self.bitlabel(94, 137,deduct_offset), bits[3:47], 'Vessel ID type is none', 'Unless national assigned, should be all 0']) self.validhex = False ########################### # Vessel 1: Maritime MMSI # ########################### elif self.vesselID == '001': self.mmsi = Func.bin2dec(bits[3:33]) if self.mmsi == 111111: self.tablebin.append([self.bitlabel(94,123,deduct_offset), bits[3:33], 'MMSI:', 'No MMSI available']) else: self.mmsi_string = str(self.mmsi).zfill(9) self.tablebin.append([self.bitlabel(94,123,deduct_offset), bits[3:33], 'Unique ship station identity where the first 3 digits are MID (MIDxxxxxx):', self.mmsi_string]) self.mmsi_country = Func.countryname(int(self.mmsi_string[0:3])) self.tablebin.append(['', '', 'Flag state of vessel:', self.mmsi_string[0:3] + ' ' + self.mmsi_country]) self.tablebin.append(['', '', 'Unique vessel number', self.mmsi_string[3:]]) self.epirb_ais = Func.bin2dec(bits[33:47]) if self.epirb_ais == 10922: self.tablebin.append([self.bitlabel(124,137,deduct_offset), bits[33:47], 'EPIRB-AIS System Identity:', 'No EPIRB-AIS System']) else: self.epirb_ais_str = str(self.epirb_ais).zfill(4) self.epirb_ais_str = '974xx' + self.epirb_ais_str self.tablebin.append([self.bitlabel(124,137,deduct_offset), bits[33:47], 'EPIRB-AIS System Identity', self.epirb_ais_str]) ############################# # Vessel 2: Radio Call Sign # ############################# elif self.vesselID == '010': self.callsign = Func.getCallsign(bits[3:45]) self.tablebin.append([self.bitlabel(94,135,deduct_offset), bits[3:45], 'Radio Callsign', self.callsign, definitions.moreinfo['sgb_radio_callsign']]) if Func.checkzeros(bits[45:47]): status_check='OK' else: status_check = 'ERROR' self.validhex = False self.tablebin.append([self.bitlabel(136,137,deduct_offset), bits[45:47], 'Spare should be 0', status_check]) ######################################################### # Vessel 3: Aricraft Registration Marking (Tail Number) # ######################################################### elif self.vesselID == '011': self.tailnum = Func.getTailNum(bits[3:45]) self.tablebin.append([self.bitlabel(94,135,deduct_offset), bits[3:45], 'Aircraft Registration Marking:', self.tailnum]) if bits[45:47]=='00': status_check = 'OK' else: status_check = 'ERROR' self.validhex = False self.tablebin.append([self.bitlabel(136,137,deduct_offset), bits[45:47], 'Spare should be 00', status_check]) ############################################## # Vessel 4: Aircraft Aviation 24 Bit Address # ############################################## elif self.vesselID == '100': self.aviationBitAddress = Func.bin2dec(bits[3:27]) self.tablebin.append([self.bitlabel(94,117,deduct_offset), bits[3:27], 'Aviation 24 bit address', str(self.aviationBitAddress)]) if Func.checkzeros(bits[27:47]): status_check = 'OK' else: status_check = 'ERROR' self.validhex = False self.tablebin.append([self.bitlabel(118,137,deduct_offset), bits[27:47], 'Spare should be 0', status_check]) ################################################# # Vessel 5: Aircraft Operator and Serial Number # ################################################# elif self.vesselID == '101': self.operator = Func.baudot2str(bits[3:21], 3) self.serialnum = Func.bin2dec(bits[21:33]) self.tablebin.append([self.bitlabel(94,111,deduct_offset), bits[3:21], 'Aircraft operator designator:', self.operator]) self.tablebin.append([self.bitlabel(112,123,deduct_offset), bits[21:33], 'Aircraft Serial number:', str(self.serialnum)]) if Func.checkones(bits[33:47]): status_check = 'OK' else: status_check = 'ERROR' self.validhex = False self.tablebin.append([self.bitlabel(124,137,deduct_offset), bits[33:47], 'Spare all should be 1', status_check]) elif self.vesselID == '111' and self.bits[43]=='1': self.tablebin.append([self.bitlabel(94, 137, deduct_offset), bits[3:47], 'Reserved for system testing','OK. Test protocol bit 43 set to 1. May contain information; default bits 94-137 - 0s']) elif self.vesselID == '111' and self.bits[43]=='0': self.tablebin.append([self.bitlabel(94, 137, deduct_offset), bits[3:47], 'Reserved for system testing', '']) elif self.vesselID == '110': self.tablebin.append([self.bitlabel(94, 137, deduct_offset), bits[3:47], 'Spare', 'ERROR! Not defined by T.018. Should not be used']) self.validhex = False
################################################# # Vessel 5: Aircraft Operator and Serial Number # ################################################# elif vesselID == 5: print '\nVessel 5: Aircraft Operator and Serial Number' while next_step is False: operator = raw_input( '\nPlease enter 3-letter aircraft operator designator: ') or ' ' if len(operator) != 3: print 'Error: aircraft operator designator must be 3 characters' else: operator_bits = Func2.str2baudot(operator).zfill(18) break printtxt('Operator Designator: {}\nbinary - {}\n'.format( Func2.baudot2str(operator_bits, 3), operator_bits)) while next_step is False: userInput = raw_input( '\nPlease enter the serial number (1 to 4095) as designated by the aircraft operator: ' ) or '1' try: aircraft_serialnum = int(userInput) except ValueError: print 'Error: value must be an integer' aircraft_serialnum = 0 else: if aircraft_serialnum > 4095 or aircraft_serialnum < 1: print 'Error: invalid serial number' else: bits_aircraft_serialnum = Func1.dec2bin(