def testDecode(self): line = '$ANALR,000000.00,007,A,V,AIS: UTC Lost*75' msg = nmea_messages.Decode(line) self.assertEqual( msg, { 'ack_state': False, 'ack_state_raw': 'V', 'condition': True, 'condition_raw': 'A', 'id': '007', 'msg': 'ALR', 'talker': 'AN', 'text': 'AIS: UTC Lost', 'time': datetime.time(0, 0) }) line = '$BSALR,134239.00,002,A,V,AIS: Antenna VSWR exceeds limit*45' msg = nmea_messages.Decode(line) self.assertEqual( msg, { 'ack_state': False, 'ack_state_raw': 'V', 'condition': True, 'condition_raw': 'A', 'id': '002', 'msg': 'ALR', 'talker': 'BS', 'text': 'AIS: Antenna VSWR exceeds limit', 'time': datetime.time(13, 42, 39) }) line = '$BSALR,000000.00,006,V,V,AIS: General Failure*0D,rbs1,1206655746.11' msg = nmea_messages.Decode(line) self.assertEqual( msg, { 'ack_state': False, 'ack_state_raw': 'V', 'condition': False, 'condition_raw': 'V', 'id': '006', 'msg': 'ALR', 'talker': 'BS', 'text': 'AIS: General Failure', 'time': datetime.time(0, 0) }) line = '$BSALR,000000.00,051,V,V,AIS: IEC Comm Error*02,rbs1,1206655746.23' msg = nmea_messages.Decode(line) self.assertEqual( msg, { 'ack_state': False, 'ack_state_raw': 'V', 'condition': False, 'condition_raw': 'V', 'id': '051', 'msg': 'ALR', 'talker': 'BS', 'text': 'AIS: IEC Comm Error', 'time': datetime.time(0, 0) })
def testDecode(self): line = '$ANADS,L3 AIS ID,024829.51,V,0,I,I*39' msg = nmea_messages.Decode(line) self.assertEqual( msg, { 'alarm': '', 'id': 'L3 AIS ID', 'msg': 'ADS', 'pos_src': 'I', 'talker': 'AN', 'time_src': 'I', 'time_sync_method': 0, 'when': datetime.time(2, 48, 29, 510000) }) line = '$BSADS,312670-BS,134839.00,A,3,N,N*22' msg = nmea_messages.Decode(line) self.assertEqual( msg, { 'alarm': '', 'id': '312670-BS', 'msg': 'ADS', 'pos_src': 'N', 'talker': 'BS', 'time_src': 'N', 'time_sync_method': 3, 'when': datetime.time(13, 48, 39) })
def testDecode(self): line = '$INZDA,082015.0007,30,04,2009,,*73' msg = nmea_messages.Decode(line) self.assertEqual( msg, { 'msg': 'ZDA', 'datetime': datetime.datetime(2009, 4, 30, 8, 20, 15, 700), 'talker': 'IN', 'zone_hours': None, 'zone_minutes': None })
def testDecode(self): line = '$AITXT,01,01,91,FREQ,2087,2088*57' msg = nmea_messages.Decode(line) self.assertEqual( msg, { 'msg': 'TXT', 'sen_num': 1, 'sen_tot': 1, 'seq_num': 91, 'talker': 'AI', 'text': 'FREQ,2087,2088' })
def testDecodeX(self): line = '$ARFSR,b003669708,000004,X,488,0,,,,,*5B' msg = nmea_messages.Decode(line) self.assertEqual( msg, { 'chan': 'X', 'id': 'b003669708', 'msg': 'FSR', 'slots_recv': 488, 'slots_self': 0, 'time': datetime.time(0, 0, 4) })
def testDecode(self): line = '$ANABK,,A,8,4,3*15' msg = nmea_messages.Decode(line) self.assertEqual( msg, { 'ack_type': 3, 'chan': 'A', 'mmsi': None, 'msg_id': 8, 'msg': 'ABK', 'seq_num': 4, 'talker': 'AN' })
def testDecodeA(self): line = '$ARFSR,r17MANP1,000001,A,0005,0,0035,,,-128,*66' msg = nmea_messages.Decode(line) self.assertEqual( msg, { 'chan': 'A', 'crc_fails': 35, 'id': 'r17MANP1', 'msg': 'FSR', 'noise_db': -128, 'slots_recv': 5, 'slots_self': 0, 'time': datetime.time(0, 0, 1) })
def testDecode(self): line = '!UPBBM,1,1,2,0,8,Fv4:3s3QJr<R@GoB64vT80,4*22' msg = nmea_messages.Decode(line) self.assertEqual( msg, { 'body': 'Fv4:3s3QJr<R@GoB64vT80', 'chan': 0, 'fill_bits': 4, 'msg': 'BBM', 'msg_id': 8, 'sen_num': 1, 'sen_tot': 1, 'seq_num': 2, 'talker': 'UP' })
def testDecodeFull(self): line = '$SAFSR,D09MN-SM-GULBS1,000000,B,115,3,5,86,3,-121,124*1F' msg = nmea_messages.Decode(line) self.assertEqual( msg, { 'chan': 'B', 'crc_fails': 5, 'id': 'D09MN-SM-GULBS1', 'msg': 'FSR', 'noise_db': -121, 'slots_above_noise': 124, 'slots_recv': 115, 'slots_reserved': 86, 'slots_reserved_self': 3, 'slots_self': 3, 'time': datetime.time(0, 0) })
def testDecode(self): line = ( '$GPGGA,174246.00,7119.6369,N,15640.8432,W,1,06,2.39,00011,M,000,M,,' '*7D') msg = nmea_messages.Decode(line) self.assertEqual( msg, { 'antenna_height': 11, 'antenna_height_units': 'M', 'geoidal_height': 0, 'geoidal_height_units': 'M', 'gps_quality': 1, 'hdop': 2.39, 'latitude': 71.32728166666666, 'longitude': -156.68072, 'msg': 'GGA', 'satellites': 6, 'time': datetime.time(17, 42, 46) })
def put(self, line, line_num=None): """Add a line of NMEA or raw text to the queue.""" if line_num is not None: self.line_num = line_num else: self.line_num += 1 line_num = self.line_num line = line.rstrip() match = Parse(line) if not match: logger.info('No VDM match for line: %d, %s', line_num, line) msg = {'line_nums': [line_num], 'lines': [line]} decoded = nmea_messages.Decode(line) if decoded: msg['decoded'] = decoded else: logger.info('No NMEA match for line: %d, %s', line_num, line) Queue.Queue.put(self, msg) return sentence_total = int(match['sen_tot']) if sentence_total == 1: body = match['body'] fill_bits = int(match['fill_bits']) try: decoded = ais.decode(body, fill_bits) except ais.DecodeError as error: logger.error('Unable to decode message: %s\n %d %s', error, line_num, line) return decoded['md5'] = hashlib.md5(body.encode('utf-8')).hexdigest() Queue.Queue.put( self, { 'line_nums': [line_num], 'lines': [line], 'decoded': decoded, 'matches': [match] }) return sentence_num = int(match['sen_num']) group_id = int(match['seq_id']) if sentence_num == 1: if group_id in self.groups: logger.error( 'Incomplete message overwritten by new start. ' 'Dropped:\n %s', self.groups[group_id]) self.groups[group_id] = { 'line_nums': [line_num], 'lines': [line], 'matches': [match] } return if group_id not in self.groups: logger.error( 'Do not have the prior lines in group_id %d. ' 'Dropping: \n %s', group_id, line) return entry = self.groups[group_id] if len(entry['lines']) != sentence_num - 1: logger.error('Out of sequence message. Dropping: %d != %d \n %s', len(entry['lines']), sentence_num - 1, line) return entry['lines'].append(line) entry['matches'].append(match) entry['line_nums'].append(line_num) if sentence_num != sentence_total: # Nothing more to do in the middle of a sequence of sentences. return body = ''.join([match['body'] for match in entry['matches']]) fill_bits = int(entry['matches'][-1]['fill_bits']) try: decoded = ais.decode(body, fill_bits) except ais.DecodeError as error: logger.error('Unable to decode message: %s\n%s', error, entry) return decoded['md5'] = hashlib.md5(body.encode('utf-8')).hexdigest() entry['decoded'] = decoded # Found the final message in a group. Queue.Queue.put(self, entry) self.groups.pop(group_id)
def put(self, line, line_num=None): if line_num is not None: self.line_num = line_num else: self.line_num += 1 line = line.rstrip() match = Parse(line) if not match: Queue.Queue.put(self, { 'line_nums': [self.line_num], 'lines': [line], }) return time = util.MaybeToNumber(match['time']) if not match['group']: msg = { 'line_nums': [self.line_num], 'lines': [line], 'matches': [match], 'times': [time], } decoded = DecodeTagSingle(msg) if decoded: msg['decoded'] = decoded else: logging.info('Unable to decode. Passing without decoded block.') decoded = nmea_messages.Decode(match['payload']) if decoded: msg['decoded'] = decoded else: logging.info('No NMEA match for line: %d, %s', line_num, line) Queue.Queue.put(self, msg) return sentence_num = int(match['sentence_num']) sentence_total = int(match['sentence_tot']) group_id = int(match['group_id']) if sentence_num == 1: self.groups[group_id] = { 'line_nums': [self.line_num], 'lines': [line], 'matches': [match], 'times': [time], } return if group_id not in self.groups: logging.error('group_id not in groups: %d', group_id) return entry = self.groups[group_id] entry['line_nums'].append(self.line_num) entry['lines'].append(line) entry['matches'].append(match) entry['times'].append(time) if sentence_num != sentence_total: # Found the middle part of a message. return # Found the final message in a group. decoded = DecodeTagMultiple(entry) if decoded: entry['decoded'] = decoded else: logging.info('Unable to process: %s', entry) Queue.Queue.put(self, entry) self.groups.pop(group_id)