visualization_client.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. import socket, sys, json, threading, time
  2. import Tkinter as tk
  3. from particle_interaction import *
  4. HOST, PORT = "127.0.0.1", 9999
  5. end='\n'
  6. def recv_end(the_socket):
  7. total_data = []
  8. data = ''
  9. while True:
  10. data = the_socket.recv(8192)
  11. if end in data:
  12. total_data.append(data[:data.find(end)])
  13. break
  14. total_data.append(data)
  15. if len(total_data) > 1:
  16. # check if end_of_data was split
  17. last_pair = total_data[-2] + total_data[-1]
  18. if end in last_pair:
  19. total_data[-2]=last_pair[:last_pair.find(end)]
  20. total_data.pop()
  21. break
  22. return ''.join(total_data)
  23. class Root(tk.Tk):
  24. def __init__(self):
  25. tk.Tk.__init__(self)
  26. self.curr_time = 0
  27. self.real_time = time.time()
  28. self.msg_queue = []
  29. self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  30. self.sock.connect((HOST, PORT))
  31. self.after(5, self.check_msg_queue)
  32. ServerThread(self.msg_queue, self.sock).start()
  33. def set_sim(self, sim):
  34. self.sim = sim
  35. def check_msg_queue(self):
  36. while self.msg_queue:
  37. self.handle_message(self.msg_queue.pop())
  38. self.after(5, self.check_msg_queue)
  39. def handle_message(self, msg):
  40. self.sim.realtime_interrupt(msg)
  41. def send_msg(self, msg):
  42. try:
  43. self.sock.send(msg + '\n')
  44. except socket.error:
  45. self.quit()
  46. def handle_output_pos(self, msgs):
  47. for msg_contents in msgs:
  48. self.send_msg(json.dumps(["POS_OUT", msg_contents]))
  49. def handle_output_color(self, msgs):
  50. for msg_contents in msgs:
  51. self.send_msg(json.dumps(["COLOR_OUT", msg_contents]))
  52. def handle_output_time(self, msgs):
  53. real_time = time.time()
  54. self.curr_time += real_time - self.real_time
  55. self.real_time = real_time
  56. for msg_contents in msgs:
  57. if (self.curr_time) - msg_contents / 30.0 > 0.05:
  58. print 'running behind! %s' % ((self.curr_time) - msg_contents / 30.0)
  59. self.send_msg(json.dumps(["TIME_OUT", "%.2f" % (float(msg_contents / 30.0))]))
  60. class ServerThread(threading.Thread):
  61. def __init__(self, queue, serversocket):
  62. threading.Thread.__init__(self)
  63. self.daemon = True
  64. self.queue = queue
  65. self.serversocket = serversocket
  66. def run(self):
  67. end = '\n'
  68. total_data = []
  69. while 1:
  70. try:
  71. data = self.serversocket.recv(8192)
  72. except socket.error:
  73. break
  74. if end in data:
  75. total_data.append(data[:data.find(end)])
  76. self.queue.append(''.join(total_data))
  77. total_data = []
  78. else:
  79. total_data.append(data)
  80. if len(total_data) > 1:
  81. # check if end_of_data was split
  82. last_pair = total_data[-2] + total_data[-1]
  83. if end in last_pair:
  84. total_data[-2]=last_pair[:last_pair.find(end)]
  85. total_data.pop()
  86. self.queue.append(''.join(total_data))
  87. if __name__ == '__main__':
  88. resolution = (800, 600)
  89. framerate = 30
  90. spawn_chance = 0.2
  91. die_chance = 0.01
  92. root = Root()
  93. root.withdraw()
  94. model = Field(Canvas(resolution), framerate, spawn_chance, die_chance)
  95. sim = Simulator(model)
  96. root.set_sim(sim)
  97. sim.setRealTime(True, 1.0 / framerate)
  98. sim.setRealTimeInputFile(None)
  99. sim.setRealTimePorts({'INTERRUPT': model.INTERRUPT})
  100. sim.setRealTimePlatformTk(root)
  101. sim.setDSDEVS(True)
  102. sim.setClassicDEVS(True)
  103. sim.setTerminationTime(60 * framerate)
  104. sim.setListenPorts(model.POS_OUT, root.handle_output_pos)
  105. sim.setListenPorts(model.COLOR_OUT, root.handle_output_color)
  106. sim.setListenPorts(model.TIME_OUT, root.handle_output_time)
  107. sim.simulate()
  108. root.mainloop()