#!/usr/bin/env python import re class GPSData: def __init__(self): self.reset() def reset(self): self.time = None self.lat = None self.lon = None self.quality = None self.nsat = None self.hdop = None self.ele = None def parse_nmea_string(self, string): try: string = string.lstrip('$') (data, dummy, csum) = string.rpartition('*') mycsum = 0 for byte in data: mycsum ^= ord(byte) if mycsum != int(csum, 16): # can throw with invalid csum return data = data.split(',') if data[0] == 'GPGGA': self.reset() # time (temp, n) = re.subn('^(\d{2})(\d{2})(\d{2}\.\d+)$', '\\1:\\2:\\3', data[1]) if n == 1: self.time = temp # latitude (temp, n) = re.subn('^(\d{2})(\d{2})\.(.*)$', '\\1.\\2\\3', data[2]) if n == 1: self.lat = temp + data[3] # longitude (temp, n) = re.subn('^0?(\d{2,3}?)(\d{2})\.(.*)$', '\\1.\\2\\3', data[4]) if n == 1: self.lon = temp + data[5] # quality if int(data[6]) == 0: self.quality = "none" elif int(data[6]) == 1: self.quality = "normal" elif int(data[6]) == 2: self.quality = "diff" elif int(data[6]) == 3: self.quality = "precision" else: self.quality = None # other params self.nsat = int(data[7]) self.hdop = data[8] self.ele = data[9] except: return def dump(self): 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)