ui_separation_test.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. from pypdevs.DEVS import AtomicDEVS, CoupledDEVS
  2. from pypdevs.simulator import Simulator
  3. from pypdevs.infinity import INFINITY
  4. import Tkinter as tk
  5. from Queue import Empty
  6. from ast import literal_eval as make_tuple
  7. class Window(tk.Toplevel):
  8. def __init__(self, sim):
  9. tk.Toplevel.__init__(self)
  10. CANVAS_SIZE_TUPLE = (0, 0, self.winfo_screenwidth(), self.winfo_screenheight())
  11. self.canvas = tk.Canvas(self, relief=tk.RIDGE, scrollregion=CANVAS_SIZE_TUPLE)
  12. self.canvas.bind("<Button-1>", self.callback)
  13. self.canvas.pack(expand = True, fill=tk.BOTH)
  14. self.sim = sim
  15. self.after(5, self.check_output)
  16. def callback(self, event):
  17. print 'Clicked (%i,%i)' % (event.x, event.y)
  18. self.sim.realtime_interrupt("INTERRUPT (%i,%i)" % (event.x, event.y))
  19. def check_output(self):
  20. while True:
  21. try:
  22. print self.sim.model.out_msg_queue.get(False)
  23. except Empty:
  24. break
  25. self.after(5, self.check_output)
  26. class CoupledModel(CoupledDEVS):
  27. def __init__(self):
  28. CoupledDEVS.__init__(self, "CoupledModel")
  29. self.INTERRUPT = self.addInPort("INTERRUPT")
  30. self.UICOMM = self.addOutPort("UICOMM")
  31. self.model = self.addSubModel(Model())
  32. self.connectPorts(self.INTERRUPT, self.model.INTERRUPT)
  33. self.connectPorts(self.model.UICOMM, self.UICOMM)
  34. class Model(AtomicDEVS):
  35. def __init__(self):
  36. AtomicDEVS.__init__(self, "Model")
  37. self.INTERRUPT = self.addInPort("INTERRUPT")
  38. self.UICOMM = self.addOutPort("UICOMM")
  39. self.remaining = 1
  40. def outputFnc(self):
  41. return {self.UICOMM: ["MyMessage"]}
  42. def intTransition(self):
  43. print 'Working...'
  44. self.remaining = 1
  45. def extTransition(self, inputs):
  46. self.remaining -= self.elapsed
  47. self.click_pos = make_tuple(inputs[self.INTERRUPT][0])
  48. print 'Interrupted (%i,%i)' % self.click_pos
  49. def timeAdvance(self):
  50. return self.remaining
  51. if __name__ == '__main__':
  52. root = tk.Tk()
  53. root.withdraw()
  54. model = CoupledModel()
  55. sim = Simulator(model)
  56. sim.setRealTime(True)
  57. sim.setRealTimeInputFile(None)
  58. sim.setRealTimePorts({'INTERRUPT': model.INTERRUPT})
  59. sim.setRealTimePlatformTk(root)
  60. sim.setDSDEVS(True)
  61. sim.setClassicDEVS(True)
  62. sim.setTerminationTime(30)
  63. window = Window(sim)
  64. sim.simulate()
  65. root.mainloop()