82 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/env python
 | |
| 
 | |
| from __future__ import division
 | |
| 
 | |
| import pylab
 | |
| import optparse
 | |
| import sys
 | |
| 
 | |
| def parse_data(l, state):
 | |
|     state['data'].append([float(x) for x in filter(None, l.split(' '))])
 | |
|     return state
 | |
| 
 | |
| def parse_event(l, state):
 | |
|     components = filter(None, l.split(' '))
 | |
|     vals = [float(x) for x in components[1:]]
 | |
|     if not components[0] in state:
 | |
|         state[components[0]] = [vals]
 | |
|     else:
 | |
|         state[components[0]].append(vals)
 | |
|     return state
 | |
| 
 | |
| def read_line(fd, state):
 | |
|     l = fd.readline()
 | |
|     if not l:
 | |
|         return None
 | |
|     l = l.strip()
 | |
|     if l[0].isdigit():
 | |
|         return parse_data(l, state)
 | |
|     else:
 | |
|         return parse_event(l, state)
 | |
| 
 | |
| def read_data(fd):
 | |
|     state = {'data':[],
 | |
|              'packet-sent':[],
 | |
|              'packet-lost':[],
 | |
|              'packet-received':[],
 | |
|              'packet-observed':[]}
 | |
|     newstate = state
 | |
|     while newstate:
 | |
|         state = newstate
 | |
|         newstate = read_line(fd, state)
 | |
|     return state
 | |
| 
 | |
| def make_xticks(start, end, numticks):
 | |
|     return range(int(start), int(end), int((start-end)/numticks))
 | |
| 
 | |
| def make_plot(title):
 | |
|     l = sys.stdin.readline()
 | |
|     labels = l.strip().split(';')
 | |
|     state = read_data(sys.stdin)
 | |
|     data = state['data']
 | |
|     lost_packets = state['packet-lost']
 | |
|     obsv_packets = state['packet-observed']
 | |
|     sent_packets = state['packet-sent']
 | |
|     recd_packets = state['packet-received']
 | |
| 
 | |
|     domain = [x[0] for x in data]
 | |
|     for i in range(1,len(labels)):
 | |
|         pylab.plot(domain, [x[i] for x in data], label=labels[i])
 | |
|     pylab.plot([x[0] for x in lost_packets], [x[1] for x in lost_packets],
 | |
|                label='Client sent packet, but dropped', marker='x', linestyle=None, ms=8)
 | |
|     pylab.plot([x[0] for x in sent_packets], [x[1] for x in sent_packets],
 | |
|                label='Client sent packet', marker='^', linestyle=None, ms=8)
 | |
|     pylab.plot([x[0] for x in obsv_packets], [x[1] for x in obsv_packets],
 | |
|                label='Remote time observation', marker='D', linestyle=None, ms=8)
 | |
|     pylab.plot([x[0] for x in recd_packets], [x[1] for x in recd_packets],
 | |
|                label='Client received packet', marker='v', linestyle=None, ms=8)
 | |
|     pylab.legend()
 | |
|     pylab.ylabel(r'Clock time (s)')
 | |
|     pylab.xlabel(r'Real time (s)')
 | |
|     pylab.title(title)
 | |
|     pylab.grid(True)
 | |
|     pylab.show()
 | |
|     
 | |
| def main(args):
 | |
|     parser = optparse.OptionParser()
 | |
| 
 | |
|     title = ' '.join(args[1:])
 | |
|     make_plot(title)
 | |
| 
 | |
| main(sys.argv)
 |