1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- #!/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)
|