view simulator/simulator.py @ 48:12d6fd69d166

added simulator
author gyorgyf
date Thu, 14 May 2015 12:31:39 +0100
parents
children
line wrap: on
line source
#!/usr/bin/env python
# encoding: utf-8
"""
simulator.py

Created by George Fazekas on 2013-08-08.
Copyright (c) 2013 . All rights reserved.
"""

import sys,os,time
import httplib as ht
import urllib
import random as r
import datetime as dt

# IP = "127.0.0.1:8030"
IP = "138.37.95.215" # this is the IP of kakapo<=>golden

HTTP_TIMEOUT = 3

class DataPoint(object):
	
	def __init__(self,x,y,ts):
		self.x = x
		self.y = y
		self.ts = ts
		
	def __repr__(self):
		return "DataPoint(%f,%f,%s)" %(self.x,self.y,str(self.ts))
		

class Simulator(object):
	
	def __init__(self):
		self.connect()
		self.data = []
		self.first_date = None
		pass
		
	def connect(self):
		self.conn = ht.HTTPConnection(IP,timeout=HTTP_TIMEOUT)
		
	def read_logdata(self,file):
		'''Read the log file'''
		with open(file,'r') as fh:
			lines = fh.readlines()[1000:]
			for line in lines :
				# x,y,ts = self.parse_logline(line)
				x,y,ts = self.parse_logline_newformat(line)
				self.data.append(DataPoint(x,y,ts))
		pass
		
	def parse_logline_newformat(self,line):
		'''parse a single line of the logfile and convert it to the appropriate datatypes'''
		x,y,ts = 0,0,0
		date,rest = line.split("]")
		h,m,s = map(lambda x: int(x.strip()), date.split(":")[-3:])
		if self.first_date == None:
			self.first_date = dt.datetime(1,1,1,h,m,s)
		ts = dt.datetime(1,1,1,h,m,s) - self.first_date
		ip,x,y,t = map(lambda x: x.strip(), rest.strip().split(","))
		# print ts,ip,x,y
		return float(x),float(y),ts
	
				
	def parse_logline(self,line):
		'''parse a single line of the logfile and convert it to the appropriate datatypes'''
		x,y,ts = 0,0,0
		date,rest = line.split("]")
		h,m,s = map(lambda x: int(x.strip()), date.split(":")[-3:])
		if self.first_date == None:
			self.first_date = dt.datetime(1,1,1,h,m,s)
		ts = dt.datetime(1,1,1,h,m,s) - self.first_date
		ip,x,y, = map(lambda x: x.strip(), rest.split("-"))
		# print ts,ip,x,y
		return float(x),float(y),ts
		
	def yield_data(self):
		for d in self.data :
			yield d
		
	def simulate(self):
		deltas = map(lambda x:(x[1].ts-x[0].ts), zip(self.data,self.data[1:]))
		# deltas = map(lambda x: x.seconds+(x.microseconds/1000000.0), deltas)
		deltas = map(lambda x: x.seconds+r.random(), deltas)
		# deltas = map(lambda x: x.seconds, deltas)		
		datagen = self.yield_data()
		for d in deltas :
			datapoint = datagen.next()
			print datapoint
			self.send_coordinate(datapoint.x, datapoint.y)
			time.sleep(d)
		pass
			
	def random(self):
		'''Send random numbers'''
		while True :
			self.send_coordinate(r.random(),r.random())
			time.sleep(0.3)
		
	def send_coordinate(self,x,y):		
		self.conn.putrequest("GET","/moodconductor/mood?x=%(x)s&y=%(y)s" %locals(), skip_host=True)
		self.conn.putheader("Host", "www.isophonics.net")
		self.conn.endheaders()
		res = self.conn.getresponse()
		res.read()
		print res.status, res.reason	
		print res.read()
		

def main():
	
	s = Simulator()
	# s.random()
	# s.read_logdata("../performance2.log")
	s.read_logdata("../performance-09Aug2013Barbican.log")
	s.simulate()

	

if __name__ == '__main__':
	main()