-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgpscat
executable file
·133 lines (120 loc) · 4.5 KB
/
gpscat
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
127
128
129
130
#!/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 = gpspacket.LOG_IO
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)
seqno = 0
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("\n"):
buf = hexdump(buf)
sys.stdout.write(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