Browse Source

Merge branch 'master' of https://g-u-i.me/gogs/bachir/hehe-rover

Bachir Soussi Chiadmi 7 years ago
parent
commit
5091d11e50
1 changed files with 86 additions and 0 deletions
  1. 86 0
      rpi/gps.py

+ 86 - 0
rpi/gps.py

@@ -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)