def Parse(data): """Unpack a TAG Block line or return None. Makes sure that the line matches the regex and the checksum matches. Args: data: Line of text or a dict from at TAG_BLOCK_RE. Returns: A NMEA TAG Block dict or None if the line would not parse or has an invalid checksum. """ if isinstance(data, str): try: result = TAG_BLOCK_RE.search(data).groupdict() except AttributeError: return elif isinstance(data, dict): result = data else: return result.update({k: util.MaybeToNumber(v) for k, v in six.iteritems(result) if k in NUMERIC_FIELDS}) actual = nmea.Checksum(result['metadata']) expected = result['tag_checksum'].upper() if actual != expected: return return result
def testChecksum(self): self.assertEqual(nmea.Checksum('$NVXDR,G,142983,,WPTTTG*00'), '00') self.assertEqual(nmea.Checksum('$GPHDT,143.59,T*0F'), '0F') self.assertEqual(nmea.Checksum('$INHDT,89.4,T*10'), '10') self.assertEqual(nmea.Checksum('$INROT,0,A*3F'), '3F') self.assertEqual( nmea.Checksum('!AIVDM,1,1,,B,14Qle<001mDoOKD`v:`Rc2;R1d00,0*00'), '00') self.assertEqual( nmea.Checksum(r'\n:121650,s:r17MHOP1,c:1425327399*1D'), '1D') self.assertEqual(nmea.Checksum(r'\g:2-2-223509,n:453068*26'), '26')
def Parse(data): """Unpack a NMEA VDM AIS message line(s).""" if not isinstance(data, six.string_types): raise NotImplementedError try: result = VDM_RE.search(data).groupdict() except AttributeError: return result.update({ k: util.MaybeToNumber(v) for k, v in six.iteritems(result) if k in NUMERIC_FIELDS }) actual = nmea.Checksum(result['vdm']) expected = result['checksum'] if actual != expected: return return result