target.py 12 KB

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