summaryrefslogtreecommitdiff
path: root/gps.py
diff options
context:
space:
mode:
authorBernd Zeimetz <bernd@bzed.de>2009-05-26 12:07:01 +0000
committerBernd Zeimetz <bernd@bzed.de>2009-05-26 12:07:01 +0000
commit3393def67eac2c4e6cf6b25a016c912baf454437 (patch)
tree50bdebd13a04b1dbd08cc97633a16bc757cdc142 /gps.py
parentfa17b5dcf1e2ad88510c5f8831550edad4a8715e (diff)
downloadgpsd-3393def67eac2c4e6cf6b25a016c912baf454437.tar.gz
gps.py: Improve setting the valid bits in O responses
Instead of checking each value twice for NaN, this commit integrates setting the valid bit with the conversion in function default(). Is it correct that there's no valid bit for the track error (fix.epd)?
Diffstat (limited to 'gps.py')
-rwxr-xr-xgps.py55
1 files changed, 27 insertions, 28 deletions
diff --git a/gps.py b/gps.py
index 01a48872..56c5e75b 100755
--- a/gps.py
+++ b/gps.py
@@ -306,47 +306,46 @@ class gps(gpsdata):
self.fix.mode = MODE_NO_FIX
else:
self.timings.sentence_tag = fields[0]
- def default(i, cnv=float):
+ def default(i, vbit=0, cnv=float):
if fields[i] == '?':
return NaN
else:
- return cnv(fields[i])
+ try:
+ value = cnv(fields[i])
+ except ValueError:
+ return NaN
+ self.valid |= vbit
+ return value
+ # clear all valid bits that might be set again below
+ self.valid &= ~(
+ TIME_SET | TIMERR_SET | LATLON_SET | ALTITUDE_SET |
+ HERR_SET | VERR_SET | TRACK_SET | SPEED_SET |
+ CLIMB_SET | SPEEDERR_SET | CLIMBERR_SET | MODE_SET
+ )
self.utc = fields[1]
- self.fix.time = default(1)
+ self.fix.time = default(1, TIME_SET)
if not isnan(self.fix.time):
self.utc = isotime(self.fix.time)
- self.fix.ept = default(2)
- self.fix.latitude = default(3)
+ self.fix.ept = default(2, TIMERR_SET)
+ self.fix.latitude = default(3, LATLON_SET)
self.fix.longitude = default(4)
- self.fix.altitude = default(5)
- self.fix.eph = default(6)
- self.fix.epv = default(7)
- self.fix.track = default(8)
- self.fix.speed = default(9)
- self.fix.climb = default(10)
+ self.fix.altitude = default(5, ALTITUDE_SET)
+ self.fix.eph = default(6, HERR_SET)
+ self.fix.epv = default(7, VERR_SET)
+ self.fix.track = default(8, TRACK_SET)
+ self.fix.speed = default(9, SPEED_SET)
+ self.fix.climb = default(10, CLIMB_SET)
self.fix.epd = default(11)
- self.fix.eps = default(12)
- self.fix.epc = default(13)
+ self.fix.eps = default(12, SPEEDERR_SET)
+ self.fix.epc = default(13, CLIMBERR_SET)
if len(fields) > 14:
- self.fix.mode = default(14, int)
+ self.fix.mode = default(14, MODE_SET, int)
else:
- if isnan(self.fix.altitude):
+ if self.valid & ALTITUDE_SET:
self.fix.mode = MODE_2D
else:
self.fix.mode = MODE_3D
- self.valid = TIME_SET | TIMERR_SET | LATLON_SET | MODE_SET
- if self.fix.mode == MODE_3D:
- self.valid |= ALTITUDE_SET | CLIMB_SET
- if not isnan(self.fix.eph):
- self.valid |= HERR_SET
- if not isnan(self.fix.epv):
- self.valid |= VERR_SET
- if not isnan(self.fix.track):
- self.valid |= TRACK_SET | SPEED_SET
- if not isnan(self.fix.eps):
- self.valid |= SPEEDERR_SET
- if not isnan(self.fix.epc):
- self.valid |= CLIMBERR_SET
+ self.valid |= MODE_SET
elif cmd == 'P':
(self.fix.latitude, self.fix.longitude) = map(float, data.split())
self.valid |= LATLON_SET