summaryrefslogtreecommitdiff
path: root/gpsfake
blob: d974a6d2fbfa43b5072c2cd7d65eec7d58be6154 (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
#!/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)