4 NMEA_DEFAULT_MAX_LENGTH = 82
5 NMEA_DEFAULT_MIN_LENGTH = 3
6 _NMEA_CHECKSUM_SEPERATOR =
"*"
10 def __init__(self, logerr=logging.error, logwarn=logging.warning, loginfo=logging.info, logdebug=logging.debug):
23 calculated_checksum = 0
24 for char
in sentence_no_checksum[1:]:
25 calculated_checksum ^= ord(char)
26 return calculated_checksum
30 decimal_degrees_sub, decimal_degrees_whole = math.modf(abs(decimal_degrees))
31 decimal_minutes_float = decimal_degrees_sub * 60
32 decimal_minutes_sub, decimal_minutes_whole = math.modf(decimal_minutes_float)
33 degrees = int(decimal_degrees_whole)
34 decimal_minutes = int(decimal_minutes_whole)
35 decimal_subminutes = int(decimal_minutes_sub * 1e5)
36 return f
"{degrees:02}{decimal_minutes:02}.{decimal_subminutes:02}"
40 decimal_degrees_sub, decimal_degrees_whole = math.modf(abs(decimal_degrees))
41 decimal_minutes_float = decimal_degrees_sub * 60
42 decimal_minutes_sub, decimal_minutes_whole = math.modf(decimal_minutes_float)
43 degrees = int(decimal_degrees_whole)
44 decimal_minutes = int(decimal_minutes_whole)
45 decimal_subminutes = int(decimal_minutes_sub * 1e5)
46 return f
"{degrees:03}{decimal_minutes:02}.{decimal_subminutes:02}"
51 self.
_logwarn(
'Received invalid NMEA sentence. Max length is {}, but sentence was {} bytes'.format(self.
nmea_max_length, len(sentence)))
52 self.
_logwarn(
'Sentence: {}'.format(sentence))
55 self.
_logwarn(
'Received invalid NMEA sentence. We need at least {} bytes to parse but got {} bytes'.format(self.
nmea_min_length, len(sentence)))
56 self.
_logwarn(
'Sentence: {}'.format(sentence))
58 if sentence[0] !=
'$' and sentence[0] !=
'!':
59 self.
_logwarn(
'Received invalid NMEA sentence. Sentence should begin with "$" or "!", but instead begins with {}'.format(sentence[0]))
60 self.
_logwarn(
'Sentence: {}'.format(sentence))
62 if sentence[-2:] !=
'\r\n':
63 self.
_logwarn(
'Received invalid NMEA sentence. Sentence should end with \\r\\n, but instead ends with {}'.format(sentence[-2:]))
64 self.
_logwarn(
'Sentence: {}'.format(sentence))
66 if _NMEA_CHECKSUM_SEPERATOR
not in sentence:
67 self.
_logwarn(
'Received invalid NMEA sentence. Sentence should have a "{}" character to seperate the checksum, but we could not find it.'.format(_NMEA_CHECKSUM_SEPERATOR))
68 self.
_logwarn(
'Sentence: {}'.format(sentence))
72 data, expected_checksum_str = sentence.rsplit(_NMEA_CHECKSUM_SEPERATOR, 1)
73 expected_checksum = int(expected_checksum_str, 16)
74 calculated_checksum = self.
checksum(data)
75 if expected_checksum != calculated_checksum:
76 self.
_logwarn(
'Received invalid NMEA sentence. Checksum mismatch');
77 self.
_logwarn(
'Expected Checksum: 0x{:X}'.format(expected_checksum))
78 self.
_logwarn(
'Calculated Checksum: 0x{:X}'.format(calculated_checksum))