|
@@ -0,0 +1,86 @@
|
|
|
+#!/bin/python
|
|
|
+# http://stackoverflow.com/questions/28867795/reading-i2c-data-from-gps/31010266
|
|
|
+
|
|
|
+import time
|
|
|
+import json
|
|
|
+import smbus
|
|
|
+import logging
|
|
|
+
|
|
|
+BUS = None
|
|
|
+address = 0x42
|
|
|
+gpsReadInterval = 0.1
|
|
|
+LOG = logging.getLogger()
|
|
|
+
|
|
|
+# GUIDE
|
|
|
+# http://ava.upuaut.net/?p=768
|
|
|
+
|
|
|
+GPSDAT = {
|
|
|
+ 'strType': None,
|
|
|
+ 'fixTime': None,
|
|
|
+ 'lat': None,
|
|
|
+ 'latDir': None,
|
|
|
+ 'lon': None,
|
|
|
+ 'lonDir': None,
|
|
|
+ 'fixQual': None,
|
|
|
+ 'numSat': None,
|
|
|
+ 'horDil': None,
|
|
|
+ 'alt': None,
|
|
|
+ 'altUnit': None,
|
|
|
+ 'galt': None,
|
|
|
+ 'galtUnit': None,
|
|
|
+ 'DPGS_updt': None,
|
|
|
+ 'DPGS_ID': None
|
|
|
+}
|
|
|
+
|
|
|
+def connectBus():
|
|
|
+ global BUS
|
|
|
+ BUS = smbus.SMBus(1)
|
|
|
+
|
|
|
+def parseResponse(gpsLine):
|
|
|
+ global lastLocation
|
|
|
+ gpsChars = ''.join(chr(c) for c in gpsLine)
|
|
|
+ if "*" not in gpsChars:
|
|
|
+ return False
|
|
|
+
|
|
|
+ gpsStr, chkSum = gpsChars.split('*')
|
|
|
+ gpsComponents = gpsStr.split(',')
|
|
|
+ gpsStart = gpsComponents[0]
|
|
|
+ if (gpsStart == "$GNGGA"):
|
|
|
+ chkVal = 0
|
|
|
+ for ch in gpsStr[1:]: # Remove the $
|
|
|
+ chkVal ^= ord(ch)
|
|
|
+ if (chkVal == int(chkSum, 16)):
|
|
|
+ for i, k in enumerate(
|
|
|
+ ['strType', 'fixTime',
|
|
|
+ 'lat', 'latDir', 'lon', 'lonDir',
|
|
|
+ 'fixQual', 'numSat', 'horDil',
|
|
|
+ 'alt', 'altUnit', 'galt', 'galtUnit',
|
|
|
+ 'DPGS_updt', 'DPGS_ID']):
|
|
|
+ GPSDAT[k] = gpsComponents[i]
|
|
|
+ print(gpsChars)
|
|
|
+ print(json.dumps(GPSDAT, indent=2))
|
|
|
+
|
|
|
+def readGPS():
|
|
|
+ c = None
|
|
|
+ response = []
|
|
|
+ try:
|
|
|
+ while True: # Newline, or bad char.
|
|
|
+ c = BUS.read_byte(address)
|
|
|
+ if c == 255:
|
|
|
+ return False
|
|
|
+ elif c == 10:
|
|
|
+ break
|
|
|
+ else:
|
|
|
+ response.append(c)
|
|
|
+ parseResponse(response)
|
|
|
+ except IOError:
|
|
|
+ time.sleep(0.5)
|
|
|
+ connectBus()
|
|
|
+ except (Exception) as e:
|
|
|
+ print(e)
|
|
|
+ LOG.error(e)
|
|
|
+
|
|
|
+connectBus()
|
|
|
+while True:
|
|
|
+ readGPS()
|
|
|
+ time.sleep(gpsReadInterval)
|