| Index: third_party/twisted_8_1/twisted/protocols/gps/nmea.py
|
| diff --git a/third_party/twisted_8_1/twisted/protocols/gps/nmea.py b/third_party/twisted_8_1/twisted/protocols/gps/nmea.py
|
| deleted file mode 100644
|
| index 74e487e69715814856ec5fb27de4b0346cce62eb..0000000000000000000000000000000000000000
|
| --- a/third_party/twisted_8_1/twisted/protocols/gps/nmea.py
|
| +++ /dev/null
|
| @@ -1,208 +0,0 @@
|
| -# -*- test-case-name: twisted.test.test_nmea -*-
|
| -# Copyright (c) 2001-2004 Twisted Matrix Laboratories.
|
| -# See LICENSE for details.
|
| -
|
| -"""NMEA 0183 implementation
|
| -
|
| -Maintainer: U{Bob Ippolito<mailto:bob@redivi.com>}
|
| -
|
| -The following NMEA 0183 sentences are currently understood::
|
| - GPGGA (fix)
|
| - GPGLL (position)
|
| - GPRMC (position and time)
|
| - GPGSA (active satellites)
|
| -
|
| -The following NMEA 0183 sentences require implementation::
|
| - None really, the others aren't generally useful or implemented in most devices anyhow
|
| -
|
| -Other desired features::
|
| - - A NMEA 0183 producer to emulate GPS devices (?)
|
| -"""
|
| -
|
| -import operator
|
| -from twisted.protocols import basic
|
| -
|
| -POSFIX_INVALID, POSFIX_SPS, POSFIX_DGPS, POSFIX_PPS = 0, 1, 2, 3
|
| -MODE_AUTO, MODE_FORCED = 'A', 'M'
|
| -MODE_NOFIX, MODE_2D, MODE_3D = 1, 2, 3
|
| -
|
| -class InvalidSentence(Exception):
|
| - pass
|
| -
|
| -class InvalidChecksum(Exception):
|
| - pass
|
| -
|
| -class NMEAReceiver(basic.LineReceiver):
|
| - """This parses most common NMEA-0183 messages, presumably from a serial GPS device at 4800 bps
|
| - """
|
| - delimiter = '\r\n'
|
| - dispatch = {
|
| - 'GPGGA': 'fix',
|
| - 'GPGLL': 'position',
|
| - 'GPGSA': 'activesatellites',
|
| - 'GPRMC': 'positiontime',
|
| - 'GPGSV': 'viewsatellites', # not implemented
|
| - 'GPVTG': 'course', # not implemented
|
| - 'GPALM': 'almanac', # not implemented
|
| - 'GPGRS': 'range', # not implemented
|
| - 'GPGST': 'noise', # not implemented
|
| - 'GPMSS': 'beacon', # not implemented
|
| - 'GPZDA': 'time', # not implemented
|
| - }
|
| - # generally you may miss the beginning of the first message
|
| - ignore_invalid_sentence = 1
|
| - # checksums shouldn't be invalid
|
| - ignore_checksum_mismatch = 0
|
| - # ignore unknown sentence types
|
| - ignore_unknown_sentencetypes = 0
|
| - # do we want to even bother checking to see if it's from the 20th century?
|
| - convert_dates_before_y2k = 1
|
| -
|
| - def lineReceived(self, line):
|
| - if not line.startswith('$'):
|
| - if self.ignore_invalid_sentence:
|
| - return
|
| - raise InvalidSentence("%r does not begin with $" % (line,))
|
| - # message is everything between $ and *, checksum is xor of all ASCII values of the message
|
| - strmessage, checksum = line[1:].strip().split('*')
|
| - message = strmessage.split(',')
|
| - sentencetype, message = message[0], message[1:]
|
| - dispatch = self.dispatch.get(sentencetype, None)
|
| - if (not dispatch) and (not self.ignore_unknown_sentencetypes):
|
| - raise InvalidSentence("sentencetype %r" % (sentencetype,))
|
| - if not self.ignore_checksum_mismatch:
|
| - checksum, calculated_checksum = int(checksum, 16), reduce(operator.xor, map(ord, strmessage))
|
| - if checksum != calculated_checksum:
|
| - raise InvalidChecksum("Given 0x%02X != 0x%02X" % (checksum, calculated_checksum))
|
| - handler = getattr(self, "handle_%s" % dispatch, None)
|
| - decoder = getattr(self, "decode_%s" % dispatch, None)
|
| - if not (dispatch and handler and decoder):
|
| - # missing dispatch, handler, or decoder
|
| - return
|
| - # return handler(*decoder(*message))
|
| - try:
|
| - decoded = decoder(*message)
|
| - except Exception, e:
|
| - raise InvalidSentence("%r is not a valid %s (%s) sentence" % (line, sentencetype, dispatch))
|
| - return handler(*decoded)
|
| -
|
| - def decode_position(self, latitude, ns, longitude, ew, utc, status):
|
| - latitude, longitude = self._decode_latlon(latitude, ns, longitude, ew)
|
| - utc = self._decode_utc(utc)
|
| - if status == 'A':
|
| - status = 1
|
| - else:
|
| - status = 0
|
| - return (
|
| - latitude,
|
| - longitude,
|
| - utc,
|
| - status,
|
| - )
|
| -
|
| - def decode_positiontime(self, utc, status, latitude, ns, longitude, ew, speed, course, utcdate, magvar, magdir):
|
| - utc = self._decode_utc(utc)
|
| - latitude, longitude = self._decode_latlon(latitude, ns, longitude, ew)
|
| - if speed != '':
|
| - speed = float(speed)
|
| - else:
|
| - speed = None
|
| - if course != '':
|
| - course = float(course)
|
| - else:
|
| - course = None
|
| - utcdate = 2000+int(utcdate[4:6]), int(utcdate[2:4]), int(utcdate[0:2])
|
| - if self.convert_dates_before_y2k and utcdate[0] > 2073:
|
| - # GPS was invented by the US DoD in 1973, but NMEA uses 2 digit year.
|
| - # Highly unlikely that we'll be using NMEA or this twisted module in 70 years,
|
| - # but remotely possible that you'll be using it to play back data from the 20th century.
|
| - utcdate = (utcdate[0] - 100, utcdate[1], utcdate[2])
|
| - if magvar != '':
|
| - magvar = float(magvar)
|
| - if magdir == 'W':
|
| - magvar = -magvar
|
| - else:
|
| - magvar = None
|
| - return (
|
| - latitude,
|
| - longitude,
|
| - speed,
|
| - course,
|
| - # UTC seconds past utcdate
|
| - utc,
|
| - # UTC (year, month, day)
|
| - utcdate,
|
| - # None or magnetic variation in degrees (west is negative)
|
| - magvar,
|
| - )
|
| -
|
| - def _decode_utc(self, utc):
|
| - utc_hh, utc_mm, utc_ss = map(float, (utc[:2], utc[2:4], utc[4:]))
|
| - return utc_hh * 3600.0 + utc_mm * 60.0 + utc_ss
|
| -
|
| - def _decode_latlon(self, latitude, ns, longitude, ew):
|
| - latitude = float(latitude[:2]) + float(latitude[2:])/60.0
|
| - if ns == 'S':
|
| - latitude = -latitude
|
| - longitude = float(longitude[:3]) + float(longitude[3:])/60.0
|
| - if ew == 'W':
|
| - longitude = -longitude
|
| - return (latitude, longitude)
|
| -
|
| - def decode_activesatellites(self, mode1, mode2, *args):
|
| - satellites, (pdop, hdop, vdop) = args[:12], map(float, args[12:])
|
| - satlist = []
|
| - for n in satellites:
|
| - if n:
|
| - satlist.append(int(n))
|
| - else:
|
| - satlist.append(None)
|
| - mode = (mode1, int(mode2))
|
| - return (
|
| - # satellite list by channel
|
| - tuple(satlist),
|
| - # (MODE_AUTO/MODE_FORCED, MODE_NOFIX/MODE_2DFIX/MODE_3DFIX)
|
| - mode,
|
| - # position dilution of precision
|
| - pdop,
|
| - # horizontal dilution of precision
|
| - hdop,
|
| - # vertical dilution of precision
|
| - vdop,
|
| - )
|
| -
|
| - def decode_fix(self, utc, latitude, ns, longitude, ew, posfix, satellites, hdop, altitude, altitude_units, geoid_separation, geoid_separation_units, dgps_age, dgps_station_id):
|
| - latitude, longitude = self._decode_latlon(latitude, ns, longitude, ew)
|
| - utc = self._decode_utc(utc)
|
| - posfix = int(posfix)
|
| - satellites = int(satellites)
|
| - hdop = float(hdop)
|
| - altitude = (float(altitude), altitude_units)
|
| - if geoid_separation != '':
|
| - geoid = (float(geoid_separation), geoid_separation_units)
|
| - else:
|
| - geoid = None
|
| - if dgps_age != '':
|
| - dgps = (float(dgps_age), dgps_station_id)
|
| - else:
|
| - dgps = None
|
| - return (
|
| - # seconds since 00:00 UTC
|
| - utc,
|
| - # latitude (degrees)
|
| - latitude,
|
| - # longitude (degrees)
|
| - longitude,
|
| - # position fix status (POSFIX_INVALID, POSFIX_SPS, POSFIX_DGPS, POSFIX_PPS)
|
| - posfix,
|
| - # number of satellites used for fix 0 <= satellites <= 12
|
| - satellites,
|
| - # horizontal dilution of precision
|
| - hdop,
|
| - # None or (altitude according to WGS-84 ellipsoid, units (typically 'M' for meters))
|
| - altitude,
|
| - # None or (geoid separation according to WGS-84 ellipsoid, units (typically 'M' for meters))
|
| - geoid,
|
| - # (age of dgps data in seconds, dgps station id)
|
| - dgps,
|
| - )
|
|
|