target.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. """
  2. Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration) and Sam Pieters (DEVS)
  3. Model author: Sam Pieters
  4. Model name: Timer (Eventloop Version)
  5. """
  6. from sccd.runtime.DEVS_statecharts_core import *
  7. from sccd.runtime.libs.ui import ui
  8. import time
  9. CANVAS_DIMS = (350, 300)
  10. # package "Timer (Eventloop Version)"
  11. class MainAppInstance(RuntimeClassBase):
  12. def __init__(self, atomdevs, id, start_port_id):
  13. RuntimeClassBase.__init__(self, atomdevs, id)
  14. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  15. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  16. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  17. self.semantics.priority = StatechartSemantics.SourceParent
  18. self.semantics.concurrency = StatechartSemantics.Single
  19. # build Statechart structure
  20. self.build_statechart_structure()
  21. # user defined attributes
  22. self.window_id = None
  23. self.canvas_id = None
  24. self.clock_id = None
  25. self.actual_clock_id = None
  26. self.button_id = None
  27. self.starting_time = None
  28. # call user defined constructor
  29. MainAppInstance.user_defined_constructor(self)
  30. port_name = addInputPort("ui", start_port_id, True)
  31. atomdevs.state.port_mappings[port_name] = None
  32. port_name = addInputPort("<narrow_cast>", start_port_id)
  33. atomdevs.state.port_mappings[port_name] = id
  34. port_name = addInputPort("field_ui", start_port_id + 1)
  35. atomdevs.state.port_mappings[port_name] = id
  36. self.inports["field_ui"] = port_name
  37. def user_defined_constructor(self):
  38. pass
  39. def user_defined_destructor(self):
  40. pass
  41. # builds Statechart structure
  42. def build_statechart_structure(self):
  43. # state <root>
  44. self.states[""] = State(0, "", self)
  45. # state /creating_window
  46. self.states["/creating_window"] = State(1, "/creating_window", self)
  47. self.states["/creating_window"].setEnter(self._creating_window_enter)
  48. # state /creating_canvas
  49. self.states["/creating_canvas"] = State(2, "/creating_canvas", self)
  50. self.states["/creating_canvas"].setEnter(self._creating_canvas_enter)
  51. # state /creating_clock_text
  52. self.states["/creating_clock_text"] = State(3, "/creating_clock_text", self)
  53. self.states["/creating_clock_text"].setEnter(self._creating_clock_text_enter)
  54. # state /creating_actual_clock_text
  55. self.states["/creating_actual_clock_text"] = State(4, "/creating_actual_clock_text", self)
  56. self.states["/creating_actual_clock_text"].setEnter(self._creating_actual_clock_text_enter)
  57. # state /creating_interrupt_button
  58. self.states["/creating_interrupt_button"] = State(5, "/creating_interrupt_button", self)
  59. self.states["/creating_interrupt_button"].setEnter(self._creating_interrupt_button_enter)
  60. # state /running
  61. self.states["/running"] = State(6, "/running", self)
  62. self.states["/running"].setEnter(self._running_enter)
  63. self.states["/running"].setExit(self._running_exit)
  64. # state /interrupted
  65. self.states["/interrupted"] = State(7, "/interrupted", self)
  66. # add children
  67. self.states[""].addChild(self.states["/creating_window"])
  68. self.states[""].addChild(self.states["/creating_canvas"])
  69. self.states[""].addChild(self.states["/creating_clock_text"])
  70. self.states[""].addChild(self.states["/creating_actual_clock_text"])
  71. self.states[""].addChild(self.states["/creating_interrupt_button"])
  72. self.states[""].addChild(self.states["/running"])
  73. self.states[""].addChild(self.states["/interrupted"])
  74. self.states[""].fixTree()
  75. self.states[""].default_state = self.states["/creating_window"]
  76. # transition /creating_window
  77. _creating_window_0 = Transition(self, self.states["/creating_window"], [self.states["/creating_canvas"]])
  78. _creating_window_0.setAction(self._creating_window_0_exec)
  79. _creating_window_0.setTrigger(Event("window_created", None))
  80. self.states["/creating_window"].addTransition(_creating_window_0)
  81. # transition /creating_canvas
  82. _creating_canvas_0 = Transition(self, self.states["/creating_canvas"], [self.states["/creating_clock_text"]])
  83. _creating_canvas_0.setAction(self._creating_canvas_0_exec)
  84. _creating_canvas_0.setTrigger(Event("canvas_created", None))
  85. self.states["/creating_canvas"].addTransition(_creating_canvas_0)
  86. # transition /creating_clock_text
  87. _creating_clock_text_0 = Transition(self, self.states["/creating_clock_text"], [self.states["/creating_actual_clock_text"]])
  88. _creating_clock_text_0.setAction(self._creating_clock_text_0_exec)
  89. _creating_clock_text_0.setTrigger(Event("text_created", None))
  90. self.states["/creating_clock_text"].addTransition(_creating_clock_text_0)
  91. # transition /creating_actual_clock_text
  92. _creating_actual_clock_text_0 = Transition(self, self.states["/creating_actual_clock_text"], [self.states["/creating_interrupt_button"]])
  93. _creating_actual_clock_text_0.setAction(self._creating_actual_clock_text_0_exec)
  94. _creating_actual_clock_text_0.setTrigger(Event("text_created", None))
  95. self.states["/creating_actual_clock_text"].addTransition(_creating_actual_clock_text_0)
  96. # transition /creating_interrupt_button
  97. _creating_interrupt_button_0 = Transition(self, self.states["/creating_interrupt_button"], [self.states["/running"]])
  98. _creating_interrupt_button_0.setAction(self._creating_interrupt_button_0_exec)
  99. _creating_interrupt_button_0.setTrigger(Event("button_created", None))
  100. self.states["/creating_interrupt_button"].addTransition(_creating_interrupt_button_0)
  101. # transition /running
  102. _running_0 = Transition(self, self.states["/running"], [self.states["/running"]])
  103. _running_0.setAction(self._running_0_exec)
  104. _running_0.setTrigger(Event("_0after"))
  105. self.states["/running"].addTransition(_running_0)
  106. _running_1 = Transition(self, self.states["/running"], [self.states["/interrupted"]])
  107. _running_1.setTrigger(Event("mouse_click", self.getInPortName("field_ui")))
  108. _running_1.setGuard(self._running_1_guard)
  109. self.states["/running"].addTransition(_running_1)
  110. # transition /interrupted
  111. _interrupted_0 = Transition(self, self.states["/interrupted"], [self.states["/running"]])
  112. _interrupted_0.setTrigger(Event("mouse_click", self.getInPortName("field_ui")))
  113. _interrupted_0.setGuard(self._interrupted_0_guard)
  114. self.states["/interrupted"].addTransition(_interrupted_0)
  115. def _creating_window_enter(self):
  116. self.big_step.outputEvent(Event("create_window", self.getOutPortName("ui"), [CANVAS_DIMS[0], CANVAS_DIMS[1], "Timer", self.inports['field_ui']]))
  117. def _creating_canvas_enter(self):
  118. self.big_step.outputEvent(Event("create_canvas", self.getOutPortName("ui"), [self.window_id, CANVAS_DIMS[0], CANVAS_DIMS[1] - 200, {'background':'#222222'}, self.inports['field_ui']]))
  119. def _creating_clock_text_enter(self):
  120. self.big_step.outputEvent(Event("create_text", self.getOutPortName("ui"), [self.canvas_id, 50, 50, '', self.inports['field_ui']]))
  121. def _creating_actual_clock_text_enter(self):
  122. self.big_step.outputEvent(Event("create_text", self.getOutPortName("ui"), [self.canvas_id, 50, 100, '', self.inports['field_ui']]))
  123. def _creating_interrupt_button_enter(self):
  124. self.big_step.outputEvent(Event("create_button", self.getOutPortName("ui"), [self.window_id, 'INTERRUPT/CONTINUE', self.inports['field_ui']]))
  125. def _running_enter(self):
  126. self.addTimer(0, 0.05)
  127. def _running_exit(self):
  128. self.removeTimer(0)
  129. def _creating_window_0_exec(self, parameters):
  130. window_id = parameters[0]
  131. self.window_id = window_id
  132. self.starting_time = time.time()
  133. self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [window_id, ui.EVENTS.WINDOW_CLOSE, 'window_close', self.inports['field_ui']]))
  134. self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [window_id, ui.EVENTS.KEY_PRESS, 'key_press', self.inports['field_ui']]))
  135. def _creating_canvas_0_exec(self, parameters):
  136. canvas_id = parameters[0]
  137. self.canvas_id = canvas_id
  138. def _creating_clock_text_0_exec(self, parameters):
  139. canvas_id = parameters[0]
  140. text_id = parameters[1]
  141. self.clock_id = text_id
  142. def _creating_actual_clock_text_0_exec(self, parameters):
  143. canvas_id = parameters[0]
  144. text_id = parameters[1]
  145. self.actual_clock_id = text_id
  146. def _creating_interrupt_button_0_exec(self, parameters):
  147. button_id = parameters[0]
  148. self.button_id = button_id
  149. self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [button_id, ui.EVENTS.MOUSE_CLICK, "mouse_click", self.inports['field_ui']]))
  150. def _running_0_exec(self, parameters):
  151. self.big_step.outputEvent(Event("update_text", self.getOutPortName("ui"), [self.canvas_id, self.clock_id, str('%.2f' % (self.getSimulatedTime() / 1000.0)), self.inports['field_ui']]))
  152. self.big_step.outputEvent(Event("update_text", self.getOutPortName("ui"), [self.canvas_id, self.actual_clock_id, str('%.2f' % (time.time() - self.starting_time)), self.inports['field_ui']]))
  153. def _running_1_guard(self, parameters):
  154. x = parameters[0]
  155. y = parameters[1]
  156. button = parameters[2]
  157. return button == ui.MOUSE_BUTTONS.LEFT
  158. def _interrupted_0_guard(self, parameters):
  159. x = parameters[0]
  160. y = parameters[1]
  161. button = parameters[2]
  162. return button == ui.MOUSE_BUTTONS.LEFT
  163. def initializeStatechart(self):
  164. # enter default state
  165. self.default_targets = self.states["/creating_window"].getEffectiveTargetStates()
  166. RuntimeClassBase.initializeStatechart(self)
  167. class MainApp(ClassBase):
  168. def __init__(self, name):
  169. ClassBase.__init__(self, name)
  170. self.input = self.addInPort("input")
  171. self.glob_outputs["ui"] = self.addOutPort("ui")
  172. self.field_ui = self.addInPort("field_ui")
  173. new_instance = self.constructObject(0, 0, [])
  174. self.state.instances[new_instance.instance_id] = new_instance
  175. new_instance.start()
  176. self.state.next_time = 0
  177. def constructObject(self, id, start_port_id, parameters):
  178. new_instance = MainAppInstance(self, id, start_port_id)
  179. return new_instance
  180. def instantiate(self, class_name):
  181. instance = {}
  182. instance["name"] = class_name
  183. if class_name == "MainApp":
  184. self.narrow_cast_id = self.narrow_cast_id + 1
  185. instance["associations"] = {}
  186. else:
  187. raise Exception("Cannot instantiate class " + class_name)
  188. return instance
  189. ObjectManagerState.instantiate = instantiate
  190. class ObjectManager(ObjectManagerBase):
  191. def __init__(self, name):
  192. ObjectManagerBase.__init__(self, name)
  193. self.state = ObjectManagerState()
  194. self.input = self.addInPort("input")
  195. self.output["MainApp"] = self.addOutPort()
  196. self.state.createInstance("MainApp")
  197. class Controller(CoupledDEVS):
  198. def __init__(self, name):
  199. CoupledDEVS.__init__(self, name)
  200. self.in_ui = self.addInPort("ui")
  201. self.out_ui = self.addOutPort("ui")
  202. self.objectmanager = self.addSubModel(ObjectManager("ObjectManager"))
  203. self.atomics = []
  204. self.atomics.append(self.addSubModel(MainApp("MainApp")))
  205. self.connectPorts(self.atomics[0].obj_manager_out, self.objectmanager.input)
  206. self.connectPorts(self.objectmanager.output["MainApp"], self.atomics[0].obj_manager_in)
  207. self.connectPorts(self.atomics[0].glob_outputs["ui"], self.out_ui)
  208. self.connectPorts(self.in_ui, self.atomics[0].input)