summaryrefslogtreecommitdiff
path: root/gpspoller.py
diff options
context:
space:
mode:
Diffstat (limited to 'gpspoller.py')
-rw-r--r--gpspoller.py88
1 files changed, 88 insertions, 0 deletions
diff --git a/gpspoller.py b/gpspoller.py
new file mode 100644
index 0000000..6f7c19c
--- /dev/null
+++ b/gpspoller.py
@@ -0,0 +1,88 @@
+#!/usr/bin/python
+
+# Copyright (C) 2007 by Jaroslaw Zachwieja
+# Modified (C) 2012 by Tim Redfern
+# Published under the terms of GNU General Public License v2 or later.
+# License text available at http://www.gnu.org/licenses/licenses.html#GPL
+
+import serial,string,threading,time,sys,random
+
+class GpsPoller(threading.Thread):
+
+ latitude = 0
+ longitude = 0
+ changed = False
+
+ def __init__(self,port,test=False):
+ self.test=test
+ self.port=port
+ self.gps = serial.Serial(port, 9600, timeout=1)
+ threading.Thread.__init__(self)
+
+ def check(self):
+ if self.changed:
+ self.changed=False
+ return (self.latitude,self.longitude)
+ else:
+ return False
+
+ def run(self):
+ if self.test:
+ print "GpsPoller: serving random data"
+ else:
+ print "GpsPoller: serving data from",self.port
+ try:
+ while True:
+ if self.test:
+ self.latitude=random.random()*90
+ self.longitude=random.random()*90
+ self.changed=True
+ time.sleep(0.5)
+ else:
+ line = self.gps.read(1)
+ line = line+self.gps.readline()
+ datablock = line.split(',')
+
+ if line[0:6] == '$GPRMC':
+ latitude_in = string.atof(datablock[3])
+ longitude_in = string.atof(datablock[5])
+ altitude = string.atof(datablock[8])
+ speed_in = string.atof(datablock[7])
+ heading = string.atof(datablock[8])
+
+ if datablock[4] == 'S':
+ latitude_in = -latitude_in
+ if datablock[6] == 'W':
+ longitude_in = -longitude_in
+
+ latitude_degrees = int(latitude_in/100)
+ latitude_minutes = latitude_in - latitude_degrees*100
+
+ longitude_degrees = int(longitude_in/100)
+ longitude_minutes = longitude_in - longitude_degrees*100
+
+ latitude = latitude_degrees + (latitude_minutes/60)
+ longitude = longitude_degrees + (longitude_minutes/60)
+
+ if latitude!=self.latitude or longitude!=self.longitude:
+ self.latitude=latitude
+ self.longitude=longitude
+ self.changed=True
+
+
+ except StopIteration:
+ pass
+
+ def __del__():
+ self.gps.close()
+
+if __name__ == '__main__':
+
+ gpsp = GpsPoller(sys.argv[1])
+ gpsp.start()
+ while 1:
+ # In the main thread, every 5 seconds print the current value
+ time.sleep(0.1)
+ check=gpsp.check()
+ if check!=False:
+ print "changed:",check[0],check[1]