Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
pytrack gps decoder
class GPSDecoder:
def __init__(self, i2c=None):
if i2c is None:
from machine import I2C
i2c = I2C(0, mode=I2C.MASTER, pins=('G9', 'G8'))
self.i2c = i2c
self.buf = ""
self.clear()
def clear(self):
self.fixStatus = self.lat = self.lng = self.utcTime = None
self.pdop = self.hdop = self.vdop = None
self.alt = self.geoid = None
self.cogT = self.cogM = self.speedKnots = self.speedKm = None
self.utcDate = None
def to_decimal(self, pos, mod):
import math
dotoffset = pos.find('.')
if 4 == dotoffset:
d, m = (pos[0:2], pos[2:])
elif 5 == dotoffset:
d, m = (pos[0:3], pos[3:])
d = float(d)
m = float(m)
r = m / 60.0
result = (d + r)
if -1 != "SW".rfind(mod):
result *= -1.0
return result
def hasPosition(self):
result = None != self.fixStatus
result &= None != self.lat
result &= None != self.lng
result &= None != self.utcTime
result &= None != self.pdop
result &= None != self.hdop
result &= None != self.vdop
result &= None != self.alt
result &= None != self.geoid
result &= None != self.fixStatus
result &= None != self.utcDate
#result &= None != self.cogT
#result &= None != self.cogM
#result &= None != self.speedKnots
#result &= None != self.speedKm
return result
def parse(self):
from utime import sleep_ms
from math import modf
received = self.i2c.readfrom(0x10, 255)
self.buf += received.decode("utf8")
lines = self.buf.split("\n")
off = 0
for line in lines:
# if len(line) > 2:
# print("line trailer: %s" % hexlify(line[-2:]))
off += len(line) + 2
exclude = False
if not line:
exclude = True
elif len(line) <= 1:
exclude = True
elif '$' != line[0]:
exclude = True
elif line[-1:] != "\r":
exclude = True
if exclude:
self.buf = self.buf[off:]
continue
if len(self.buf) > 1024:
self.buf = self.buf[1+self.buf.rfind("\n"):]
line = line.strip()
lastAsterisk = line.rfind('*')
if -1 != lastAsterisk:
line = line[:lastAsterisk]
args = line.split(",")
command = args[0]
if command[-3:] == "GLL":
lat = args[1]
ns = args[2]
lng = args[3]
ew = args[4]
utcTime = args[5]
dataValid = args[6]
positioningMode = args[7]
self.lat = self.to_decimal(lat, ns)
self.lng = self.to_decimal(lng, ew)
self.utcTime = utcTime
elif command[-3:] == "GSA":
self.fixStatus = args[2]
self.pdop = float(args[-3])
self.hdop = float(args[-2])
self.vdop = float(args[-1])
elif command[-3:] == "GSV":
# Ignored. Pura Groselha.
pass
elif command[-3:] == "GGA":
self.utcTime = args[1]
self.lat = self.to_decimal(args[2], args[3])
self.lng = self.to_decimal(args[4], args[5])
self.fixStatus = args[6]
self.hdop = float(args[8])
self.alt = float(args[9])
self.geoid = float(args[11])
elif command[-3:] == "VTG":
#print("args:%s" % repr(args))
if 0 != len(args[1]):
self.cogT = float(args[1])
if 0 != len(args[3]):
self.cogM = float(args[3])
self.speedKnots = float(args[5])
self.speedKm = float(args[7])
self.fixStatus = args[9][0]
elif command[-3:] == "RMC":
valid = args[2]
if "A" == valid:
self.utcTime = args[1]
self.lat = self.to_decimal(args[3], args[4])
self.lng = self.to_decimal(args[5], args[6])
self.speedKnots = float(args[7])
self.cogM = float(args[8])
self.utcDate = args[9]
self.fixStatus = args[12][0]
else:
print("Not parsed: %s" % repr(args))
self.buf = self.buf[off:]
# TODO: Use just the time difference instead of a fixed value
sleep_ms(500)
return self.hasPosition()
d = GPSDecoder()
while not d.parse():
pass
@Beniz2

This comment has been minimized.

Copy link

@Beniz2 Beniz2 commented Jun 20, 2017

Hello, I don't really undrestand this code. I need to do a tracker do you think this will help me ?

@Patrick93600

This comment has been minimized.

Copy link

@Patrick93600 Patrick93600 commented Jul 29, 2017

Good Day all,
I'm a very beginner with Pytrak & Python and do not have understood the way to call the constructor & class from gpsdecoder.py.
Would it be possible for one of you to help me by providing an example of main.py calling the class.
My intention is to collect the GGA (NMEA) sentences, including GPS & Altitude.
Thanks in advance for your help.
Best regards.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment