Skip to content

Commit

Permalink
Fixes to GPSd -plugin.
Browse files Browse the repository at this point in the history
Fixed showing of GPS time with GPSd and serial. Also made GPS time to be local time instead of UTC.
Fixed gpsWindow updater running even if window wasn't open.
  • Loading branch information
kipe committed Oct 3, 2012
1 parent 0bf2b90 commit 7181686
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 25 deletions.
36 changes: 18 additions & 18 deletions gmapcatcher/gps/gps.py
Original file line number Diff line number Diff line change
Expand Up @@ -181,12 +181,12 @@ def __oldstyle_unpack(self, buf):
else:
def default(i, vbit=0, cnv=float):
if fields[i] == '?':
return NaN
return None
else:
try:
value = cnv(fields[i])
except ValueError:
return NaN
return None
self.valid |= vbit
return value
# clear all valid bits that might be set again below
Expand Down Expand Up @@ -254,8 +254,8 @@ def default(k, dflt, vbit=0):
self.driver_mode = default("native", 0)
self.baudrate = default("bps", 0)
self.serialmode = default("serialmode", "8N1")
self.cycle = default("cycle", NaN)
self.mincycle = default("mincycle", NaN)
self.cycle = default("cycle", None)
self.mincycle = default("mincycle", None)
elif self.data.get("class") == "TPV":
self.valid = ONLINE_SET
self.utc = default("time", None, TIME_SET)
Expand All @@ -265,23 +265,23 @@ def default(k, dflt, vbit=0):
self.fix.time = self.utc
else:
self.fix.time = isotime(self.utc.encode("ascii"))
self.fix.ept = default("ept", NaN, TIMERR_SET)
self.fix.latitude = default("lat", NaN, LATLON_SET)
self.fix.longitude = default("lon", NaN)
self.fix.altitude = default("alt", NaN, ALTITUDE_SET)
self.fix.epx = default("epx", NaN, HERR_SET)
self.fix.epy = default("epy", NaN, HERR_SET)
self.fix.epv = default("epv", NaN, VERR_SET)
self.fix.track = default("track", NaN, TRACK_SET)
self.fix.speed = default("speed", NaN, SPEED_SET)
self.fix.climb = default("climb", NaN, CLIMB_SET)
self.fix.epd = default("epd", NaN)
self.fix.eps = default("eps", NaN, SPEEDERR_SET)
self.fix.epc = default("epc", NaN, CLIMBERR_SET)
self.fix.ept = default("ept", None, TIMERR_SET)
self.fix.latitude = default("lat", None, LATLON_SET)
self.fix.longitude = default("lon", None)
self.fix.altitude = default("alt", None, ALTITUDE_SET)
self.fix.epx = default("epx", None, HERR_SET)
self.fix.epy = default("epy", None, HERR_SET)
self.fix.epv = default("epv", None, VERR_SET)
self.fix.track = default("track", None, TRACK_SET)
self.fix.speed = default("speed", None, SPEED_SET)
self.fix.climb = default("climb", None, CLIMB_SET)
self.fix.epd = default("epd", None)
self.fix.eps = default("eps", None, SPEEDERR_SET)
self.fix.epc = default("epc", None, CLIMBERR_SET)
self.fix.mode = default("mode", 0, MODE_SET)
elif self.data.get("class") == "SKY":
for attrp in ("x", "y", "v", "h", "p", "g"):
setattr(self, attrp+"dop", default(attrp+"dop", NaN, DOP_SET))
setattr(self, attrp+"dop", default(attrp+"dop", None, DOP_SET))
if "satellites" in self.data.keys():
self.satellites = []
for sat in self.data['satellites']:
Expand Down
2 changes: 1 addition & 1 deletion gmapcatcher/serialGPS.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ def serialPortScan():
class gpsfix:
def __init__(self):
self.mode = MODE_NO_FIX
self.time = ''
self.time = None
self.ept = None
self.latitude = self.longitude = None
self.epx = None
Expand Down
32 changes: 29 additions & 3 deletions gmapcatcher/widgets/gpsWindow.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,17 @@
from pango import FontDescription
from gmapcatcher.mapConst import *
from gmapcatcher import mapUtils
from datetime import datetime, timedelta
import time
from gmapcatcher.gps import misc


class gpsWindow(gtk.Window):
def __init__(self, mapsObj):
gtk.Window.__init__(self)
self.mapsObj = mapsObj
self.gps_values = []
self.__stop = False
vbox = gtk.VBox(False)
vbox.pack_start(self._createLabels(FontDescription("16")))
self.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG)
Expand All @@ -40,6 +44,8 @@ def key_press(self, w, event):

def on_delete(self, widget=None, event=None):
self.mapsObj.gpsw = None
self.__stop = True
self.destroy()

def _createLabels(self, font):
texts = ['GPS time', 'Latitude', 'Longitude', 'Speed', 'Heading', 'Altitude']
Expand Down Expand Up @@ -97,8 +103,25 @@ def update_widgets(self):
else:
self.fix_label.set_text('<b><span foreground=\"red\">NO FIX</span></b>')
if self.mapsObj.gps.gpsfix.time:
gps_time = str(self.mapsObj.gps.gpsfix.time)
self.gps_values[0].set_text('%s:%s:%s' % (gps_time[0:2], gps_time[2:4], gps_time[4:6]))
d = None
s = self.mapsObj.gps.gpsfix.time
offset = timedelta(seconds=time.timezone if (time.daylight == 0) else time.altzone)
if self.mapsObj.conf.gps_type == TYPE_GPSD:
if not isinstance(s, int) and not isinstance(s, float):
s = misc.isotime(self.mapsObj.gps.gpsfix.time)
d = datetime.utcfromtimestamp(s)
d = d - offset
else:
if '.' in s:
d = datetime.strptime(s, '%H%M%S.%f')
else:
d = datetime.strptime(s, '%H%M%S')
d = d - offset
if d:
gps_time = '%s:%s:%s' % (str(d.hour).rjust(2, '0'),
str(d.minute).rjust(2, '0'), str(d.second).rjust(2, '0'))
if gps_time:
self.gps_values[0].set_text(gps_time)
if self.mapsObj.gps.gpsfix.latitude:
self.gps_values[1].set_text('%.6f' % self.mapsObj.gps.gpsfix.latitude)
if self.mapsObj.gps.gpsfix.longitude:
Expand All @@ -118,4 +141,7 @@ def update_widgets(self):
for gps_value in self.gps_values:
gps_value.set_text('---')
self.fix_label.set_use_markup(True)
return True
if self.__stop:
return False
else:
return True
6 changes: 3 additions & 3 deletions maps.py
Original file line number Diff line number Diff line change
Expand Up @@ -230,11 +230,11 @@ def gps_callback(self):
tile = mapUtils.coord_to_tile((self.gps.gpsfix.latitude, self.gps.gpsfix.longitude, zl))
self.gps_valid = True
# The map should be centered around a new GPS location
if self.gps.mode == GPS_CENTER or self.reCenter_gps:
if not self.Ruler and (self.gps.mode == GPS_CENTER or self.reCenter_gps):
self.reCenter_gps = False
self.drawing_area.center = tile
# The map should be moved only to keep GPS location on the screen
elif self.gps.mode == GPS_ON_SCREEN:
elif self.gps.mode == GPS_ON_SCREEN and not self.Ruler:
rect = self.drawing_area.get_allocation()
xy = mapUtils.tile_coord_to_screen(
(tile[0][0], tile[0][1], zl), rect, self.drawing_area.center)
Expand All @@ -256,7 +256,7 @@ def gps_callback(self):
else:
self.drawing_area.center = tile
# GPS update timeout, recenter GPS only after 3 sec idle
elif self.gps.mode == GPS_TIMEOUT:
elif self.gps.mode == GPS_TIMEOUT and not self.Ruler:
if (time.time() - self.gps_idle_time) > 3:
self.drawing_area.center = tile

Expand Down

0 comments on commit 7181686

Please sign in to comment.