com.py
author Eugen Sawin <sawine@me73.com>
Tue, 15 Jun 2010 14:58:05 +0200
changeset 5 5ab3cc2e7851
parent 4 4cee17e91d29
child 6 9147c845cecb
permissions -rw-r--r--
Added debugging view. Packet loss suspected.
sawine@0
     1
import model
sawine@0
     2
import pickle
sawine@5
     3
import hashlib
sawine@5
     4
from operator import attrgetter
sawine@0
     5
sawine@0
     6
commands = {}
sawine@0
     7
sawine@2
     8
def help(socket, client, worker):
sawine@0
     9
	socket.sendto("\n".join([key + ": " + value[1] 
sawine@0
    10
		for key, value in commands.iteritems()]) + "\n", client)
sawine@0
    11
sawine@2
    12
def createModel(socket, client, worker, (name,)):
sawine@0
    13
	model.createModel(name)
sawine@0
    14
	socket.sendto("model %s created\n" % name, client)
sawine@0
    15
	
sawine@2
    16
def deleteModel(socket, client, worker, (name,)):
sawine@0
    17
	if model.deleteModel(name):
sawine@0
    18
		socket.sendto("model %s deleted\n" % name, client)
sawine@0
    19
		
sawine@2
    20
def saveModel(socket, client, worker, (name,)):
sawine@0
    21
	model = lookupModel(socket, client, name)
sawine@0
    22
	if model:
sawine@4
    23
		pickle.dump(model, open(name + ".model", "w"))
sawine@0
    24
		socket.sendto("model %s saved\n" % name, client)
sawine@0
    25
		
sawine@2
    26
def loadModel(socket, client, worker, (name,)):	
sawine@4
    27
	model.addModel(pickle.load(open(name + ".model", "r")))
sawine@2
    28
	socket.sendto("model %s loaded\n" % name, client)		
sawine@5
    29
sawine@5
    30
def getModel(name):
sawine@5
    31
	if name in model.models:
sawine@5
    32
		return model.models[name]
sawine@5
    33
	
sawine@0
    34
def lookupModel(socket, client, name):
sawine@0
    35
	if name not in model.models:
sawine@0
    36
		socket.sendto("model %s not found\n" % name, client)
sawine@0
    37
		return None
sawine@0
    38
	else:
sawine@0
    39
		return model.models[name]
sawine@0
    40
		
sawine@2
    41
def addObserver(socket, client, worker, (modelName, eventType)):
sawine@0
    42
	model = lookupModel(socket, client, modelName)
sawine@0
    43
	if model:
sawine@0
    44
		model.register(socket, client, eventType)
sawine@0
    45
		socket.sendto("observer for event type %s added: " % eventType 
sawine@0
    46
			+ str(client) + "\n", client)
sawine@0
    47
		
sawine@2
    48
def setResolution(socket, client, worker, (modelName, x, y)):
sawine@0
    49
	model = lookupModel(socket, client, modelName)
sawine@0
    50
	if model:
sawine@0
    51
		model.setResolution(int(x), int(y))
sawine@0
    52
		socket.sendto("model %s resolution set to %s, %s\n" % 
sawine@0
    53
			(modelName, x, y), client)
sawine@0
    54
			
sawine@2
    55
def setRange(socket, client, worker, (modelName, begin, end)):
sawine@0
    56
	model = lookupModel(socket, client, modelName)
sawine@0
    57
	if model:
sawine@0
    58
		model.setRange(complex(begin), complex(end))
sawine@0
    59
		socket.sendto("model %s range set to %s, %s\n" % 
sawine@0
    60
			(modelName, begin, end), client)
sawine@0
    61
sawine@2
    62
def update(socket, client, worker, (modelName, iterations)):
sawine@0
    63
	model = lookupModel(socket, client, modelName)
sawine@0
    64
	if model:
sawine@3
    65
		old_res = model.resolution
sawine@3
    66
		begin_y = model.range[0].imag
sawine@3
    67
		end_y = model.range[1].imag
sawine@3
    68
		begin_x = model.range[0].real
sawine@3
    69
		end_x = model.range[1].real
sawine@3
    70
		step_x = (end_x - begin_x) / len(worker)
sawine@3
    71
		model.resolution = (old_res[0] / len(worker), old_res[1])
sawine@3
    72
sawine@3
    73
		for i, w in enumerate(worker):
sawine@3
    74
			new_begin_x = begin_x + step_x * i
sawine@3
    75
			new_end_x = begin_x + step_x * (i + 1)
sawine@3
    76
			model.range = (complex(new_begin_x, begin_y), 
sawine@3
    77
							complex(new_end_x, end_y))
sawine@3
    78
			print model.range
sawine@3
    79
			print model.resolution
sawine@5
    80
			model.cells = {}
sawine@2
    81
			dump = pickle.dumps(model)
sawine@4
    82
			socket.sendto("%010i%s%010i" % (len(dump), dump, 
sawine@4
    83
				int(iterations)), w) 
sawine@0
    84
		socket.sendto("model %s updated with max %s iterations\n" 
sawine@0
    85
			% (modelName, iterations), client)
sawine@3
    86
		model.range = (complex(begin_x, begin_y), complex(end_x, end_y))
sawine@3
    87
		model.resolution = old_res
sawine@5
    88
sawine@5
    89
def view(socket, client, worker, (name,)):
sawine@5
    90
	model = lookupModel(socket, client, name)
sawine@5
    91
	if model:
sawine@5
    92
		keys = model.cells.keys()
sawine@5
    93
		keys.sort(key=attrgetter("real", "imag"))
sawine@5
    94
		cells = {}
sawine@5
    95
		for k in keys:
sawine@5
    96
			cells[k] = model.cells[k]
sawine@5
    97
		print "size: %i hash: %s" % (len(cells), 
sawine@5
    98
				hashlib.sha256(str(cells)).hexdigest())
sawine@5
    99
	
sawine@0
   100
commands = {"help": (help, "help"),
sawine@0
   101
	"create model": (createModel, "creates a new model"),
sawine@0
   102
	"delete model": (deleteModel, "deletes a model"),	
sawine@0
   103
	"save model": (saveModel, "makes a persistent copy of the model"),
sawine@0
   104
	"load model": (loadModel, "loads a persistent model"),
sawine@0
   105
	"set resolution": (setResolution, "sets the model resolution"),
sawine@0
   106
	"set range": (setRange, "sets the model range"),
sawine@0
   107
	"update": (update, "updates the model data"),
sawine@5
   108
	"view": (view, "shows the model data"),
sawine@3
   109
	"add observer": (addObserver, "adds an observer to a model's events"),}