visualization_server.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import SocketServer
  2. import threading, time, json, socket
  3. import Tkinter as tk
  4. from tkinter_widget import TkinterWidget
  5. import particle_interaction_vis
  6. from python_runtime.statecharts_core import Event
  7. from python_runtime.tkinter_eventloop import *
  8. class Root(tk.Tk):
  9. def __init__(self, msg_queue, output_queue, framerate):
  10. tk.Tk.__init__(self)
  11. self.msg_queue = msg_queue
  12. self.output_queue = output_queue
  13. self.framerate = framerate
  14. self.after(5, self.check_msg_queue)
  15. self.after(5, self.check_output)
  16. def set_controller(self, controller):
  17. self.controller = controller
  18. self.ui_reply_port = self.controller.addOutputListener('output')
  19. def check_msg_queue(self):
  20. while self.msg_queue:
  21. self.handle_message(self.msg_queue.pop())
  22. self.after(5, self.check_msg_queue)
  23. def handle_message(self, message):
  24. decoded_msg = json.loads(message)
  25. msg_contents = decoded_msg[1]
  26. if decoded_msg[0] == "POS_OUT":
  27. if msg_contents[0] == "delete":
  28. event = Event("delete_particle", "input", [msg_contents[1]])
  29. elif msg_contents[0] == "created":
  30. event = Event("create_particle", "input", [msg_contents[1:]])
  31. else:
  32. event = Event("move_particle", "input", [msg_contents])
  33. elif decoded_msg[0] == "COLOR_OUT":
  34. event = Event("color_particle", "input", [msg_contents])
  35. elif decoded_msg[0] == "TIME_OUT":
  36. event = Event("update_time", "input", ["%.2f" % (float(msg_contents) / self.framerate)])
  37. if event:
  38. self.controller.addInput(event)
  39. def check_output(self):
  40. while True:
  41. reply_msg = self.ui_reply_port.fetch(0)
  42. if reply_msg == None:
  43. break
  44. event_name = reply_msg.getName()
  45. parameters = reply_msg.getParameters()
  46. if event_name == "particle_clicked":
  47. self.output_queue.append("INTERRUPT %i" % parameters[0])
  48. elif event_name == "delete_selected":
  49. self.output_queue.append("INTERRUPT delete_selected")
  50. self.after(5, self.check_output)
  51. class ServerThread(threading.Thread):
  52. def __init__(self, queue, output_queue):
  53. threading.Thread.__init__(self)
  54. self.daemon = True
  55. self.queue = queue
  56. self.output_queue = output_queue
  57. def run(self):
  58. self.serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  59. self.serversocket.bind(('', 9999))
  60. self.serversocket.listen(1)
  61. self.clientsocket, address = self.serversocket.accept()
  62. end = '\n'
  63. total_data = []
  64. while 1:
  65. while self.output_queue:
  66. self.clientsocket.send(self.output_queue.pop() + '\n')
  67. data = self.clientsocket.recv(8192)
  68. if end in data:
  69. total_data.append(data[:data.find(end)])
  70. self.queue.append(''.join(total_data))
  71. total_data = []
  72. else:
  73. total_data.append(data)
  74. if len(total_data) > 1:
  75. # check if end_of_data was split
  76. last_pair = total_data[-2] + total_data[-1]
  77. if end in last_pair:
  78. total_data[-2]=last_pair[:last_pair.find(end)]
  79. total_data.pop()
  80. self.queue.append(''.join(total_data))
  81. if __name__ == "__main__":
  82. msg_queue, output_queue = [], []
  83. st = ServerThread(msg_queue, output_queue)
  84. st.start()
  85. root = Root(msg_queue, output_queue, 30)
  86. root.withdraw()
  87. controller = particle_interaction_vis.Controller(root, (800, 600), TkEventLoop(root))
  88. TkinterWidget.controller = controller
  89. root.set_controller(controller)
  90. controller.start()
  91. root.mainloop()
  92. st.serversocket.close()
  93. st.clientsocket.close()