Initial import
[uberlogger] / nmea.py
1 #!/usr/bin/env python
2
3 import re
4
5 class GPSData:
6         def __init__(self):
7                 self.reset()
8
9         def reset(self):
10                 self.time = None
11                 self.lat = None
12                 self.lon = None
13                 self.quality = None
14                 self.nsat = None
15                 self.hdop = None
16                 self.ele = None
17
18         def parse_nmea_string(self, string):
19                 try:
20                         string = string.lstrip('$')
21                         (data, dummy, csum) = string.rpartition('*')
22
23                         mycsum = 0
24                         for byte in data:
25                                 mycsum ^= ord(byte)
26
27                         if mycsum != int(csum, 16): # can throw with invalid csum
28                                 return
29
30                         data = data.split(',')
31
32                         if data[0] == 'GPGGA':
33                                 self.reset()
34
35                                 # time
36                                 (temp, n) = re.subn('^(\d{2})(\d{2})(\d{2}\.\d+)$', '\\1:\\2:\\3', data[1])
37                                 if n == 1:
38                                         self.time = temp
39
40                                 # latitude
41                                 (temp, n) = re.subn('^(\d{2})(\d{2})\.(.*)$', '\\1.\\2\\3', data[2])
42                                 if n == 1:
43                                         self.lat = temp + data[3]
44
45                                 # longitude
46                                 (temp, n) = re.subn('^0?(\d{2,3}?)(\d{2})\.(.*)$', '\\1.\\2\\3', data[4])
47                                 if n == 1:
48                                         self.lon = temp + data[5]
49
50                                 # quality
51                                 if int(data[6]) == 0:
52                                         self.quality = "none"
53                                 elif int(data[6]) == 1:
54                                         self.quality = "normal"
55                                 elif int(data[6]) == 2:
56                                         self.quality = "diff"
57                                 elif int(data[6]) == 3:
58                                         self.quality = "precision"
59                                 else:
60                                         self.quality = None
61
62                                 # other params
63                                 self.nsat = int(data[7])
64                                 self.hdop = data[8]
65                                 self.ele = data[9]
66                 except:
67                         return
68
69         def dump(self):
70                 return "Time: %s\tQuality: %s\nLat: %s\tSat: %s\nLon: %s\tHDOP: %s\nEle: %s" % (self.time, self.quality, self.lat, self.nsat, self.lon, self.hdop, self.ele)