target.py 12 KB

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