summaryrefslogtreecommitdiff
path: root/gpscat
blob: a6a830128ce457481a669677bd2e0fc766572a38 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#!/usr/bin/env python
#
# Display GPS output.  Hexify it if necessary.
#
import os, sys, termios, select, getopt, curses.ascii

NMEA_MAX = 82

def hexdump(str):
    dmp = ""
    for (i, ch) in enumerate(str):
        if curses.ascii.isprint(ord(ch)):
            dmp += ch
        elif ch == '\r' and i+1 < len(str) and str[i+1] == '\n':
            dmp += ch
        elif ch == '\n' and i-1 >= 0 and str[i-1] == '\r':
            dmp += ch
        else:
            dmp += "\\x%02x" % ord(ch)
    return dmp

if __name__ == '__main__':
    buf = ""
    try:
        try:
            (options, arguments) = getopt.getopt(sys.argv[1:], "hs:V")
        except getopt.GetoptError, msg:
            print "gpscat: " + str(msg)
            raise SystemExit, 1

        speed = None
        parity = None
        stopbits = None
        for (switch, val) in options:
            if switch == '-s':
                if val[-2] in ('N', 'E', 'O'):
                    parity = val[-2]
                    stopbits = int(val[-1])
                    val = val[:-2]
                speed = int(val)
            elif switch == '-h':
                sys.stderr.write("usage: gpscat [-s] 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)

        while True:
            (fd, event) = poller.poll()[0]
            if fd == tty and event == select.POLLIN:
                buf += os.read(tty, NMEA_MAX)
                if not buf.endswith("\r"):
                    sys.stdout.write(hexdump(buf))
                    buf = ""
    except KeyboardInterrupt:
        sys.stdout.write("\n")
        raise SystemExit, 0