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
|
#!/usr/bin/env python
#
# gpsfake -- test harness for gpsd
#
# Simulates a GPS, playing back an NMEA logfile
import sys, os, time, signal, pty, getopt, tempfile, termios
(options, arguments) = getopt.getopt(sys.argv[1:], "c:hns:")
cycle = 1
speed = 0
spawn = True
for (switch, val) in options:
if (switch == '-c'):
cycle = int(val)
elif (switch == '-n'):
spawn = False
elif (switch == '-s'):
speed = int(val)
elif (switch == '-h'):
sys.stderr.write("usage: gpsfake [-h] [-n] [-s speed] [-c cycle] logfile\n")
sys.exit(0)
logfile = arguments[0]
try:
(master_fd, slave_fd) = pty.openpty()
except:
sys.stderr.write("gpsfake: can't open pty.\n")
sys.exit(1)
slave = os.ttyname(slave_fd)
spawncmd = "gpsd -P /tmp/gpsfake%d -p %s" % (os.getpid(), slave)
if speed:
spawncmd += " -s %d" % speed
if not spawn:
sys.stderr.write("gpsfake: slave tty is %s\n" % slave)
elif os.system(spawncmd):
sys.stderr.write("gpsfake: gpsd launch failed.\n")
sys.exit(1)
else:
sys.stderr.write("gpsfake: gpsd launch OK.\n")
fp = open("/tmp/gpsfake%s" % os.getpid())
pid = int(fp.read())
fp.close()
os.remove("/tmp/gpsfake%s" % os.getpid())
try:
logfp = open(logfile, "r")
lines = logfp.readlines()
logfp.close()
ttyfp = open(slave, "rw")
raw = termios.tcgetattr(ttyfp.fileno())
raw[0] = 0 # iflag
raw[1] = termios.ONLCR # oflag
raw[2] &= ~(termios.PARENB | termios.CRTSCTS) # cflag
raw[2] |= (termios.CSIZE & termios.CS8) # cflag
raw[2] |= termios.CREAD | termios.CLOCAL # cflag
raw[3] = 0 # lflag
raw[4] = raw[5] = eval("termios.B" + `speed`)
termios.tcsetattr(ttyfp.fileno(), termios.TCSANOW, raw)
i = 0;
while True:
time.sleep(cycle)
os.write(master_fd, lines[i % len(lines)])
i += 1
finally:
if spawn:
os.kill(pid, signal.SIGTERM)
|