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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
#!/usr/bin/env 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 = 5
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
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)
while True:
(fd, event) = poller.poll()[0]
if fd == tty and event == select.POLLIN:
if rawmode:
buf += os.read(tty, NMEA_MAX)
if not buf.endswith("\r"):
sys.stdout.write(hexdump(buf))
buf = ""
else:
(type, packet) = getter.get(tty)
length = len(packet)
if type == gpspacket.EOF_PACKET:
break
elif type == gpspacket.BAD_PACKET or length == 0:
continue
if typeflag:
sys.stdout.write(`type` + " (" + `length` + "): " + hexdump(packet) + "\n")
else:
sys.stdout.write(hexdump(packet) + "\n")
except KeyboardInterrupt:
if rawmode:
sys.stdout.write("\n")
raise SystemExit, 0
|