diff options
author | Greg Troxel <gdt@ir.bbn.com> | 2009-12-02 15:47:06 +0000 |
---|---|---|
committer | Greg Troxel <gdt@ir.bbn.com> | 2009-12-02 15:47:06 +0000 |
commit | 96d59fdac2b9eee55171ade78a729331a9f92197 (patch) | |
tree | a62c813a44d9e3e3ba218750adba8b017bbd77a1 /gpscat.in | |
parent | 36d56a924abac976402b0ef0b72703009ab649b6 (diff) | |
download | gpsd-96d59fdac2b9eee55171ade78a729331a9f92197.tar.gz |
Substitute $PYTHON instead of assuming 'python' is python.
Now 'make check' runs on NetbSD, and $(prefix)/bin/gpsfake works.
Diffstat (limited to 'gpscat.in')
-rw-r--r-- | gpscat.in | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/gpscat.in b/gpscat.in new file mode 100644 index 00000000..d7a2391f --- /dev/null +++ b/gpscat.in @@ -0,0 +1,129 @@ +#!@PYTHON@ +# +# Display GPS output. Hexify it if necessary. +# +import os, sys, termios, select, getopt, curses.ascii +import gpspacket + +# The spec says 82, but some receivers (TN-200, GSW 2.3.2) output 86 characters +NMEA_MAX = 86 + +# Lowest debug level at which packet getter begins to emit messages, minus one +BASELEVEL = gpspacket.LOG_IO + +highhalf_latch = True + +def hexdump(str): + dmp = "" + for (i, ch) in enumerate(str): + if curses.ascii.isprint(ord(ch)) or curses.ascii.isspace(ord(ch)): + dmp += ch + else: + dmp += "\\x%02x" % ord(ch) + return dmp + +debuglevel = 0 + +def reporter(errlevel, msg): + if errlevel <= debuglevel: + sys.stdout.write(msg) + +if __name__ == '__main__': + buf = "" + try: + try: + (options, arguments) = getopt.getopt(sys.argv[1:], "hps:tv:V") + except getopt.GetoptError, msg: + print "gpscat: " + str(msg) + raise SystemExit, 1 + + speed = None + parity = None + stopbits = None + rawmode = True + typeflag = False + for (switch, val) in options: + if switch == '-p': + rawmode = False + elif switch == '-s': + if val[-2] in ('N', 'E', 'O'): + parity = val[-2] + stopbits = int(val[-1]) + val = val[:-2] + speed = int(val) + elif switch == '-t': + typeflag = True + rawmode = False + elif switch == '-v': + debuglevel = BASELEVEL + int(val) + elif switch == '-h': + sys.stderr.write("usage: gpscat [-s speed] serial-port\n") + raise SystemExit, 0 + elif switch == '-V': + sys.stderr.write("gpscat at svn revision $Rev$\n") + raise SystemExit, 0 + + tty = os.open(arguments[0], os.O_RDWR) + if speed != None: + (iflag, oflag, cflag, lflag, ispeed, ospeed, cc) = termios.tcgetattr(tty) + try: + ispeed = ospeed = eval("termios.B%d" % speed) + except AttributeError: + sys.stderr.write("gpscat: unknown baud rate %d\n" % speed) + raise SystemExit, 1 + if stopbits: + cflag &= ~termios.CSIZE + cflag |= (termios.CS8, termios.CS7)[stopbits-1] + if parity: + if parity == 'N': + iflag &= ~termios.PARENB + iflag &= ~termios.INPCK + elif parity == 'O': + iflag |= termios.INPCK + cflag |= termios.PARENB + cflag |= termios.PARODD + elif parity == 'E': + iflag |= termios.INPCK + cflag |= termios.PARENB + cflag &= ~termios.PARODD + termios.tcsetattr(tty, termios.TCSANOW, + [iflag, oflag, cflag, lflag, ispeed, ospeed, cc]) + + poller = select.poll() + poller.register(tty, select.POLLIN) + + buf = "" + if not rawmode: + getter = gpspacket.new() + gpspacket.register_report(reporter) + seqno = 0 + while True: + (fd, event) = poller.poll()[0] + if fd == tty and event == select.POLLIN: + if rawmode: + buf += os.read(tty, NMEA_MAX) + sys.stdout.write(hexdump(buf)) + buf = "" + else: + (length, ptype, packet) = getter.get(tty) + seqno += 1 + # Don't crap out if the first packet is bad, we might + # be seeing an incomplete read from a tty. + if ptype == gpspacket.BAD_PACKET and seqno >= 2: + if debuglevel >= BASELEVEL: + sys.stdout.write("gpscat: terminating on bad packet\n") + break + elif length == 0: + break + if typeflag: + sys.stdout.write(`ptype` + " (" + `length` + "): " + hexdump(packet)) + sys.stdout.write("\n") + else: + sys.stdout.write(hexdump(packet) + "\n") + except KeyboardInterrupt: + if rawmode: + sys.stdout.write("\n") + raise SystemExit, 0 + + + |