target.py 48 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870
  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: Bouncing_Balls_DEVS_Version
  5. Model description:
  6. Tkinter frame with bouncing balls in it.
  7. """
  8. from sccd.runtime.DEVS_statecharts_core import *
  9. from sccd.runtime.libs import ui_v2 as ui
  10. import random
  11. CANVAS_DIMS = (800, 550)
  12. # package "Bouncing_Balls_DEVS_Version"
  13. class MainAppInstance(RuntimeClassBase):
  14. def __init__(self, atomdevs, id, start_port_id):
  15. RuntimeClassBase.__init__(self, atomdevs, id)
  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. # call user defined constructor
  24. MainAppInstance.user_defined_constructor(self)
  25. port_name = addInputPort("ui", start_port_id, True)
  26. atomdevs.state.port_mappings[port_name] = None
  27. port_name = addInputPort("<narrow_cast>", start_port_id)
  28. atomdevs.state.port_mappings[port_name] = id
  29. def user_defined_constructor(self):
  30. self.nr_of_fields = 0
  31. def user_defined_destructor(self):
  32. pass
  33. # builds Statechart structure
  34. def build_statechart_structure(self):
  35. # state <root>
  36. self.states[""] = State(0, "", self)
  37. # state /running
  38. self.states["/running"] = State(1, "/running", self)
  39. # state /running/root
  40. self.states["/running/root"] = ParallelState(2, "/running/root", self)
  41. # state /running/root/main_behaviour
  42. self.states["/running/root/main_behaviour"] = State(3, "/running/root/main_behaviour", self)
  43. # state /running/root/main_behaviour/initializing
  44. self.states["/running/root/main_behaviour/initializing"] = State(4, "/running/root/main_behaviour/initializing", self)
  45. # state /running/root/main_behaviour/running
  46. self.states["/running/root/main_behaviour/running"] = State(5, "/running/root/main_behaviour/running", self)
  47. # state /running/root/cd_behaviour
  48. self.states["/running/root/cd_behaviour"] = State(6, "/running/root/cd_behaviour", self)
  49. # state /running/root/cd_behaviour/waiting
  50. self.states["/running/root/cd_behaviour/waiting"] = State(7, "/running/root/cd_behaviour/waiting", self)
  51. # state /running/root/cd_behaviour/creating
  52. self.states["/running/root/cd_behaviour/creating"] = State(8, "/running/root/cd_behaviour/creating", self)
  53. # state /running/root/cd_behaviour/check_nr_of_fields
  54. self.states["/running/root/cd_behaviour/check_nr_of_fields"] = State(9, "/running/root/cd_behaviour/check_nr_of_fields", self)
  55. self.states["/running/root/cd_behaviour/check_nr_of_fields"].setEnter(self._running_root_cd_behaviour_check_nr_of_fields_enter)
  56. self.states["/running/root/cd_behaviour/check_nr_of_fields"].setExit(self._running_root_cd_behaviour_check_nr_of_fields_exit)
  57. # state /running/root/cd_behaviour/stopped
  58. self.states["/running/root/cd_behaviour/stopped"] = State(10, "/running/root/cd_behaviour/stopped", self)
  59. # state /running/stopped
  60. self.states["/running/stopped"] = State(11, "/running/stopped", self)
  61. # add children
  62. self.states[""].addChild(self.states["/running"])
  63. self.states["/running"].addChild(self.states["/running/root"])
  64. self.states["/running"].addChild(self.states["/running/stopped"])
  65. self.states["/running/root"].addChild(self.states["/running/root/main_behaviour"])
  66. self.states["/running/root"].addChild(self.states["/running/root/cd_behaviour"])
  67. self.states["/running/root/main_behaviour"].addChild(self.states["/running/root/main_behaviour/initializing"])
  68. self.states["/running/root/main_behaviour"].addChild(self.states["/running/root/main_behaviour/running"])
  69. self.states["/running/root/cd_behaviour"].addChild(self.states["/running/root/cd_behaviour/waiting"])
  70. self.states["/running/root/cd_behaviour"].addChild(self.states["/running/root/cd_behaviour/creating"])
  71. self.states["/running/root/cd_behaviour"].addChild(self.states["/running/root/cd_behaviour/check_nr_of_fields"])
  72. self.states["/running/root/cd_behaviour"].addChild(self.states["/running/root/cd_behaviour/stopped"])
  73. self.states[""].fixTree()
  74. self.states[""].default_state = self.states["/running"]
  75. self.states["/running"].default_state = self.states["/running/root"]
  76. self.states["/running/root/main_behaviour"].default_state = self.states["/running/root/main_behaviour/initializing"]
  77. self.states["/running/root/cd_behaviour"].default_state = self.states["/running/root/cd_behaviour/waiting"]
  78. # transition /running/root/main_behaviour/initializing
  79. _running_root_main_behaviour_initializing_0 = Transition(self, self.states["/running/root/main_behaviour/initializing"], [self.states["/running/root/main_behaviour/running"]])
  80. _running_root_main_behaviour_initializing_0.setAction(self._running_root_main_behaviour_initializing_0_exec)
  81. _running_root_main_behaviour_initializing_0.setTrigger(None)
  82. self.states["/running/root/main_behaviour/initializing"].addTransition(_running_root_main_behaviour_initializing_0)
  83. # transition /running/root/main_behaviour/running
  84. _running_root_main_behaviour_running_0 = Transition(self, self.states["/running/root/main_behaviour/running"], [self.states["/running/root/main_behaviour/running"]])
  85. _running_root_main_behaviour_running_0.setAction(self._running_root_main_behaviour_running_0_exec)
  86. _running_root_main_behaviour_running_0.setTrigger(Event("button_pressed", None))
  87. _running_root_main_behaviour_running_0.setGuard(self._running_root_main_behaviour_running_0_guard)
  88. self.states["/running/root/main_behaviour/running"].addTransition(_running_root_main_behaviour_running_0)
  89. # transition /running/root/cd_behaviour/waiting
  90. _running_root_cd_behaviour_waiting_0 = Transition(self, self.states["/running/root/cd_behaviour/waiting"], [self.states["/running/root/cd_behaviour/creating"]])
  91. _running_root_cd_behaviour_waiting_0.setAction(self._running_root_cd_behaviour_waiting_0_exec)
  92. _running_root_cd_behaviour_waiting_0.setTrigger(Event("create_field", None))
  93. self.states["/running/root/cd_behaviour/waiting"].addTransition(_running_root_cd_behaviour_waiting_0)
  94. _running_root_cd_behaviour_waiting_1 = Transition(self, self.states["/running/root/cd_behaviour/waiting"], [self.states["/running/root/cd_behaviour/check_nr_of_fields"]])
  95. _running_root_cd_behaviour_waiting_1.setAction(self._running_root_cd_behaviour_waiting_1_exec)
  96. _running_root_cd_behaviour_waiting_1.setTrigger(Event("delete_field", None))
  97. self.states["/running/root/cd_behaviour/waiting"].addTransition(_running_root_cd_behaviour_waiting_1)
  98. # transition /running/root/cd_behaviour/creating
  99. _running_root_cd_behaviour_creating_0 = Transition(self, self.states["/running/root/cd_behaviour/creating"], [self.states["/running/root/cd_behaviour/waiting"]])
  100. _running_root_cd_behaviour_creating_0.setAction(self._running_root_cd_behaviour_creating_0_exec)
  101. _running_root_cd_behaviour_creating_0.setTrigger(Event("instance_created", None))
  102. self.states["/running/root/cd_behaviour/creating"].addTransition(_running_root_cd_behaviour_creating_0)
  103. # transition /running/root/cd_behaviour/check_nr_of_fields
  104. _running_root_cd_behaviour_check_nr_of_fields_0 = Transition(self, self.states["/running/root/cd_behaviour/check_nr_of_fields"], [self.states["/running/root/cd_behaviour/stopped"]])
  105. _running_root_cd_behaviour_check_nr_of_fields_0.setAction(self._running_root_cd_behaviour_check_nr_of_fields_0_exec)
  106. _running_root_cd_behaviour_check_nr_of_fields_0.setTrigger(Event("_0after"))
  107. _running_root_cd_behaviour_check_nr_of_fields_0.setGuard(self._running_root_cd_behaviour_check_nr_of_fields_0_guard)
  108. self.states["/running/root/cd_behaviour/check_nr_of_fields"].addTransition(_running_root_cd_behaviour_check_nr_of_fields_0)
  109. _running_root_cd_behaviour_check_nr_of_fields_1 = Transition(self, self.states["/running/root/cd_behaviour/check_nr_of_fields"], [self.states["/running/root/cd_behaviour/waiting"]])
  110. _running_root_cd_behaviour_check_nr_of_fields_1.setTrigger(None)
  111. _running_root_cd_behaviour_check_nr_of_fields_1.setGuard(self._running_root_cd_behaviour_check_nr_of_fields_1_guard)
  112. self.states["/running/root/cd_behaviour/check_nr_of_fields"].addTransition(_running_root_cd_behaviour_check_nr_of_fields_1)
  113. # transition /running/root
  114. _running_root_0 = Transition(self, self.states["/running/root"], [self.states["/running/stopped"]])
  115. _running_root_0.setAction(self._running_root_0_exec)
  116. _running_root_0.setTrigger(Event("stop", None))
  117. self.states["/running/root"].addTransition(_running_root_0)
  118. def _running_root_cd_behaviour_check_nr_of_fields_enter(self):
  119. self.addTimer(0, 0.05)
  120. def _running_root_cd_behaviour_check_nr_of_fields_exit(self):
  121. self.removeTimer(0)
  122. def _running_root_0_exec(self, parameters):
  123. self.big_step.outputEvent(Event("destroy_all", self.getOutPortName("ui"), []))
  124. def _running_root_main_behaviour_initializing_0_exec(self, parameters):
  125. self.raiseInternalEvent(Event("create_field", None, []))
  126. def _running_root_main_behaviour_running_0_exec(self, parameters):
  127. event_name = parameters[0]
  128. self.raiseInternalEvent(Event("create_field", None, []))
  129. def _running_root_main_behaviour_running_0_guard(self, parameters):
  130. event_name = parameters[0]
  131. return event_name == "create_new_field"
  132. def _running_root_cd_behaviour_waiting_0_exec(self, parameters):
  133. self.big_step.outputEventOM(Event("create_instance", None, [self, "fields"]))
  134. def _running_root_cd_behaviour_waiting_1_exec(self, parameters):
  135. association_name = parameters[0]
  136. self.big_step.outputEventOM(Event("delete_instance", None, [self, association_name]))
  137. self.nr_of_fields -= 1
  138. def _running_root_cd_behaviour_creating_0_exec(self, parameters):
  139. association_name = parameters[0]
  140. self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
  141. self.big_step.outputEventOM(Event("narrow_cast", None, [self, association_name, Event("set_association_name", None, [association_name])]))
  142. self.nr_of_fields += 1
  143. def _running_root_cd_behaviour_check_nr_of_fields_0_exec(self, parameters):
  144. self.raiseInternalEvent(Event("stop", None, []))
  145. def _running_root_cd_behaviour_check_nr_of_fields_0_guard(self, parameters):
  146. return self.nr_of_fields == 0
  147. def _running_root_cd_behaviour_check_nr_of_fields_1_guard(self, parameters):
  148. return self.nr_of_fields != 0
  149. def initializeStatechart(self):
  150. # enter default state
  151. self.default_targets = self.states["/running"].getEffectiveTargetStates()
  152. RuntimeClassBase.initializeStatechart(self)
  153. class MainApp(ClassBase):
  154. def __init__(self, name):
  155. ClassBase.__init__(self, name)
  156. self.input = self.addInPort("input")
  157. self.glob_outputs["ui"] = self.addOutPort("ui")
  158. new_instance = self.constructObject(0, 0, [])
  159. self.state.instances[new_instance.instance_id] = new_instance
  160. new_instance.start()
  161. self.state.next_time = 0
  162. def constructObject(self, id, start_port_id, parameters):
  163. new_instance = MainAppInstance(self, id, start_port_id)
  164. return new_instance
  165. class FieldInstance(RuntimeClassBase):
  166. def __init__(self, atomdevs, id, start_port_id):
  167. RuntimeClassBase.__init__(self, atomdevs, id)
  168. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  169. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  170. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  171. self.semantics.priority = StatechartSemantics.SourceParent
  172. self.semantics.concurrency = StatechartSemantics.Single
  173. # build Statechart structure
  174. self.build_statechart_structure()
  175. # user defined attributes
  176. self.window_id = None
  177. self.canvas_id = None
  178. # call user defined constructor
  179. FieldInstance.user_defined_constructor(self)
  180. port_name = addInputPort("ui", start_port_id, True)
  181. atomdevs.state.port_mappings[port_name] = None
  182. port_name = addInputPort("<narrow_cast>", start_port_id)
  183. atomdevs.state.port_mappings[port_name] = id
  184. port_name = addInputPort("field_ui", start_port_id + 1)
  185. atomdevs.state.port_mappings[port_name] = id
  186. self.inports["field_ui"] = port_name
  187. def user_defined_constructor(self):
  188. pass
  189. def user_defined_destructor(self):
  190. pass
  191. # builds Statechart structure
  192. def build_statechart_structure(self):
  193. # state <root>
  194. self.states[""] = State(0, "", self)
  195. # state /root
  196. self.states["/root"] = State(1, "/root", self)
  197. # state /root/waiting
  198. self.states["/root/waiting"] = State(2, "/root/waiting", self)
  199. # state /root/creating_window
  200. self.states["/root/creating_window"] = State(3, "/root/creating_window", self)
  201. self.states["/root/creating_window"].setEnter(self._root_creating_window_enter)
  202. # state /root/creating_canvas
  203. self.states["/root/creating_canvas"] = State(4, "/root/creating_canvas", self)
  204. self.states["/root/creating_canvas"].setEnter(self._root_creating_canvas_enter)
  205. # state /root/creating_button
  206. self.states["/root/creating_button"] = State(5, "/root/creating_button", self)
  207. self.states["/root/creating_button"].setEnter(self._root_creating_button_enter)
  208. # state /root/running
  209. self.states["/root/running"] = ParallelState(6, "/root/running", self)
  210. # state /root/running/main_behaviour
  211. self.states["/root/running/main_behaviour"] = State(7, "/root/running/main_behaviour", self)
  212. # state /root/running/main_behaviour/running
  213. self.states["/root/running/main_behaviour/running"] = State(8, "/root/running/main_behaviour/running", self)
  214. # state /root/running/main_behaviour/creating_ball
  215. self.states["/root/running/main_behaviour/creating_ball"] = State(9, "/root/running/main_behaviour/creating_ball", self)
  216. # state /root/running/deleting_behaviour
  217. self.states["/root/running/deleting_behaviour"] = State(10, "/root/running/deleting_behaviour", self)
  218. # state /root/running/deleting_behaviour/running
  219. self.states["/root/running/deleting_behaviour/running"] = State(11, "/root/running/deleting_behaviour/running", self)
  220. # state /root/running/child_behaviour
  221. self.states["/root/running/child_behaviour"] = State(12, "/root/running/child_behaviour", self)
  222. # state /root/running/child_behaviour/listening
  223. self.states["/root/running/child_behaviour/listening"] = State(13, "/root/running/child_behaviour/listening", self)
  224. # state /root/running/deleting_balls_behaviour
  225. self.states["/root/running/deleting_balls_behaviour"] = State(14, "/root/running/deleting_balls_behaviour", self)
  226. # state /root/running/deleting_balls_behaviour/listening
  227. self.states["/root/running/deleting_balls_behaviour/listening"] = State(15, "/root/running/deleting_balls_behaviour/listening", self)
  228. # state /root/deleting
  229. self.states["/root/deleting"] = State(16, "/root/deleting", self)
  230. # state /root/deleted
  231. self.states["/root/deleted"] = State(17, "/root/deleted", self)
  232. # add children
  233. self.states[""].addChild(self.states["/root"])
  234. self.states["/root"].addChild(self.states["/root/waiting"])
  235. self.states["/root"].addChild(self.states["/root/creating_window"])
  236. self.states["/root"].addChild(self.states["/root/creating_canvas"])
  237. self.states["/root"].addChild(self.states["/root/creating_button"])
  238. self.states["/root"].addChild(self.states["/root/running"])
  239. self.states["/root"].addChild(self.states["/root/deleting"])
  240. self.states["/root"].addChild(self.states["/root/deleted"])
  241. self.states["/root/running"].addChild(self.states["/root/running/main_behaviour"])
  242. self.states["/root/running"].addChild(self.states["/root/running/deleting_behaviour"])
  243. self.states["/root/running"].addChild(self.states["/root/running/child_behaviour"])
  244. self.states["/root/running"].addChild(self.states["/root/running/deleting_balls_behaviour"])
  245. self.states["/root/running/main_behaviour"].addChild(self.states["/root/running/main_behaviour/running"])
  246. self.states["/root/running/main_behaviour"].addChild(self.states["/root/running/main_behaviour/creating_ball"])
  247. self.states["/root/running/deleting_behaviour"].addChild(self.states["/root/running/deleting_behaviour/running"])
  248. self.states["/root/running/child_behaviour"].addChild(self.states["/root/running/child_behaviour/listening"])
  249. self.states["/root/running/deleting_balls_behaviour"].addChild(self.states["/root/running/deleting_balls_behaviour/listening"])
  250. self.states[""].fixTree()
  251. self.states[""].default_state = self.states["/root"]
  252. self.states["/root"].default_state = self.states["/root/waiting"]
  253. self.states["/root/running/main_behaviour"].default_state = self.states["/root/running/main_behaviour/running"]
  254. self.states["/root/running/deleting_behaviour"].default_state = self.states["/root/running/deleting_behaviour/running"]
  255. self.states["/root/running/child_behaviour"].default_state = self.states["/root/running/child_behaviour/listening"]
  256. self.states["/root/running/deleting_balls_behaviour"].default_state = self.states["/root/running/deleting_balls_behaviour/listening"]
  257. # transition /root/waiting
  258. _root_waiting_0 = Transition(self, self.states["/root/waiting"], [self.states["/root/creating_window"]])
  259. _root_waiting_0.setAction(self._root_waiting_0_exec)
  260. _root_waiting_0.setTrigger(Event("set_association_name", None))
  261. self.states["/root/waiting"].addTransition(_root_waiting_0)
  262. # transition /root/creating_window
  263. _root_creating_window_0 = Transition(self, self.states["/root/creating_window"], [self.states["/root/creating_canvas"]])
  264. _root_creating_window_0.setAction(self._root_creating_window_0_exec)
  265. _root_creating_window_0.setTrigger(Event("window_created", None))
  266. self.states["/root/creating_window"].addTransition(_root_creating_window_0)
  267. # transition /root/creating_canvas
  268. _root_creating_canvas_0 = Transition(self, self.states["/root/creating_canvas"], [self.states["/root/creating_button"]])
  269. _root_creating_canvas_0.setAction(self._root_creating_canvas_0_exec)
  270. _root_creating_canvas_0.setTrigger(Event("canvas_created", None))
  271. self.states["/root/creating_canvas"].addTransition(_root_creating_canvas_0)
  272. # transition /root/creating_button
  273. _root_creating_button_0 = Transition(self, self.states["/root/creating_button"], [self.states["/root/running"]])
  274. _root_creating_button_0.setAction(self._root_creating_button_0_exec)
  275. _root_creating_button_0.setTrigger(Event("instance_created", None))
  276. self.states["/root/creating_button"].addTransition(_root_creating_button_0)
  277. # transition /root/running/main_behaviour/running
  278. _root_running_main_behaviour_running_0 = Transition(self, self.states["/root/running/main_behaviour/running"], [self.states["/root/running/main_behaviour/creating_ball"]])
  279. _root_running_main_behaviour_running_0.setAction(self._root_running_main_behaviour_running_0_exec)
  280. _root_running_main_behaviour_running_0.setTrigger(Event("right_click", self.getInPortName("field_ui")))
  281. self.states["/root/running/main_behaviour/running"].addTransition(_root_running_main_behaviour_running_0)
  282. # transition /root/running/main_behaviour/creating_ball
  283. _root_running_main_behaviour_creating_ball_0 = Transition(self, self.states["/root/running/main_behaviour/creating_ball"], [self.states["/root/running/main_behaviour/running"]])
  284. _root_running_main_behaviour_creating_ball_0.setAction(self._root_running_main_behaviour_creating_ball_0_exec)
  285. _root_running_main_behaviour_creating_ball_0.setTrigger(Event("instance_created", None))
  286. self.states["/root/running/main_behaviour/creating_ball"].addTransition(_root_running_main_behaviour_creating_ball_0)
  287. # transition /root/running/deleting_behaviour/running
  288. _root_running_deleting_behaviour_running_0 = Transition(self, self.states["/root/running/deleting_behaviour/running"], [self.states["/root/running/deleting_behaviour/running"]])
  289. _root_running_deleting_behaviour_running_0.setAction(self._root_running_deleting_behaviour_running_0_exec)
  290. _root_running_deleting_behaviour_running_0.setTrigger(Event("delete_ball", None))
  291. self.states["/root/running/deleting_behaviour/running"].addTransition(_root_running_deleting_behaviour_running_0)
  292. # transition /root/running/child_behaviour/listening
  293. _root_running_child_behaviour_listening_0 = Transition(self, self.states["/root/running/child_behaviour/listening"], [self.states["/root/running/child_behaviour/listening"]])
  294. _root_running_child_behaviour_listening_0.setAction(self._root_running_child_behaviour_listening_0_exec)
  295. _root_running_child_behaviour_listening_0.setTrigger(Event("button_pressed", None))
  296. self.states["/root/running/child_behaviour/listening"].addTransition(_root_running_child_behaviour_listening_0)
  297. # transition /root/running/deleting_balls_behaviour/listening
  298. _root_running_deleting_balls_behaviour_listening_0 = Transition(self, self.states["/root/running/deleting_balls_behaviour/listening"], [self.states["/root/running/deleting_balls_behaviour/listening"]])
  299. _root_running_deleting_balls_behaviour_listening_0.setAction(self._root_running_deleting_balls_behaviour_listening_0_exec)
  300. _root_running_deleting_balls_behaviour_listening_0.setTrigger(Event("key_press", self.getInPortName("field_ui")))
  301. _root_running_deleting_balls_behaviour_listening_0.setGuard(self._root_running_deleting_balls_behaviour_listening_0_guard)
  302. self.states["/root/running/deleting_balls_behaviour/listening"].addTransition(_root_running_deleting_balls_behaviour_listening_0)
  303. # transition /root/deleting
  304. _root_deleting_0 = Transition(self, self.states["/root/deleting"], [self.states["/root/deleted"]])
  305. _root_deleting_0.setAction(self._root_deleting_0_exec)
  306. _root_deleting_0.setTrigger(None)
  307. self.states["/root/deleting"].addTransition(_root_deleting_0)
  308. # transition /root/running
  309. _root_running_0 = Transition(self, self.states["/root/running"], [self.states["/root/deleting"]])
  310. _root_running_0.setAction(self._root_running_0_exec)
  311. _root_running_0.setTrigger(Event("window_close", self.getInPortName("field_ui")))
  312. self.states["/root/running"].addTransition(_root_running_0)
  313. def _root_creating_window_enter(self):
  314. self.big_step.outputEvent(Event("create_window", self.getOutPortName("ui"), [800, 600, "BouncingBalls", self.inports['field_ui']]))
  315. def _root_creating_canvas_enter(self):
  316. self.big_step.outputEvent(Event("create_canvas", self.getOutPortName("ui"), [self.window_id, CANVAS_DIMS[0], CANVAS_DIMS[1], {'background':'#eee'}, self.inports['field_ui']]))
  317. def _root_creating_button_enter(self):
  318. self.big_step.outputEventOM(Event("create_instance", None, [self, "buttons", "Button", self.window_id, 'create_new_field', 'Spawn New Window']))
  319. def _root_running_0_exec(self, parameters):
  320. self.big_step.outputEventOM(Event("delete_instance", None, [self, "buttons"]))
  321. self.big_step.outputEventOM(Event("delete_instance", None, [self, "balls"]))
  322. def _root_waiting_0_exec(self, parameters):
  323. association_name = parameters[0]
  324. self.association_name = association_name
  325. def _root_creating_window_0_exec(self, parameters):
  326. window_id = parameters[0]
  327. self.window_id = window_id
  328. self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [window_id, ui.EVENTS.WINDOW_CLOSE, 'window_close', self.inports['field_ui']]))
  329. self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [window_id, ui.EVENTS.KEY_PRESS, 'key_press', self.inports['field_ui']]))
  330. def _root_creating_canvas_0_exec(self, parameters):
  331. canvas_id = parameters[0]
  332. self.canvas_id = canvas_id
  333. self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [canvas_id, ui.EVENTS.MOUSE_RIGHT_CLICK, 'right_click', self.inports['field_ui']]))
  334. self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [canvas_id, ui.EVENTS.MOUSE_MOVE, 'mouse_move', self.inports['field_ui']]))
  335. self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [canvas_id, ui.EVENTS.MOUSE_RELEASE, 'mouse_release', self.inports['field_ui']]))
  336. def _root_creating_button_0_exec(self, parameters):
  337. association_name = parameters[0]
  338. self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
  339. def _root_running_main_behaviour_running_0_exec(self, parameters):
  340. x = parameters[0]
  341. y = parameters[1]
  342. button = parameters[2]
  343. self.big_step.outputEventOM(Event("create_instance", None, [self, "balls", "Ball", self.canvas_id, x, y]))
  344. def _root_running_main_behaviour_creating_ball_0_exec(self, parameters):
  345. association_name = parameters[0]
  346. self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
  347. self.big_step.outputEventOM(Event("narrow_cast", None, [self, association_name, Event("set_association_name", None, [association_name])]))
  348. def _root_running_deleting_behaviour_running_0_exec(self, parameters):
  349. association_name = parameters[0]
  350. self.big_step.outputEventOM(Event("delete_instance", None, [self, association_name]))
  351. def _root_running_child_behaviour_listening_0_exec(self, parameters):
  352. event_name = parameters[0]
  353. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("button_pressed", None, [event_name])]))
  354. def _root_running_deleting_balls_behaviour_listening_0_exec(self, parameters):
  355. key = parameters[0]
  356. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'balls', Event("delete_self", None, [])]))
  357. def _root_running_deleting_balls_behaviour_listening_0_guard(self, parameters):
  358. key = parameters[0]
  359. return key == ui.KEYCODES.DELETE
  360. def _root_deleting_0_exec(self, parameters):
  361. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("delete_field", None, [self.association_name])]))
  362. self.big_step.outputEvent(Event("destroy_window", self.getOutPortName("ui"), [self.window_id]))
  363. def initializeStatechart(self):
  364. # enter default state
  365. self.default_targets = self.states["/root"].getEffectiveTargetStates()
  366. RuntimeClassBase.initializeStatechart(self)
  367. class Field(ClassBase):
  368. def __init__(self, name):
  369. ClassBase.__init__(self, name)
  370. self.input = self.addInPort("input")
  371. self.glob_outputs["ui"] = self.addOutPort("ui")
  372. self.field_ui = self.addInPort("field_ui")
  373. def constructObject(self, id, start_port_id, parameters):
  374. new_instance = FieldInstance(self, id, start_port_id)
  375. return new_instance
  376. class ButtonInstance(RuntimeClassBase):
  377. def __init__(self, atomdevs, id, start_port_id, window_id, event_name, button_text):
  378. RuntimeClassBase.__init__(self, atomdevs, id)
  379. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  380. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  381. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  382. self.semantics.priority = StatechartSemantics.SourceParent
  383. self.semantics.concurrency = StatechartSemantics.Single
  384. # build Statechart structure
  385. self.build_statechart_structure()
  386. # user defined attributes
  387. self.window_id = None
  388. self.event_name = None
  389. self.button_id = None
  390. # call user defined constructor
  391. ButtonInstance.user_defined_constructor(self, window_id, event_name, button_text)
  392. port_name = addInputPort("ui", start_port_id, True)
  393. atomdevs.state.port_mappings[port_name] = None
  394. port_name = addInputPort("<narrow_cast>", start_port_id)
  395. atomdevs.state.port_mappings[port_name] = id
  396. port_name = addInputPort("button_ui", start_port_id + 1)
  397. atomdevs.state.port_mappings[port_name] = id
  398. self.inports["button_ui"] = port_name
  399. def user_defined_constructor(self, window_id, event_name, button_text):
  400. self.window_id = window_id;
  401. self.event_name = event_name;
  402. def user_defined_destructor(self):
  403. pass
  404. # builds Statechart structure
  405. def build_statechart_structure(self):
  406. # state <root>
  407. self.states[""] = State(0, "", self)
  408. # state /creating_button
  409. self.states["/creating_button"] = State(1, "/creating_button", self)
  410. self.states["/creating_button"].setEnter(self._creating_button_enter)
  411. # state /running
  412. self.states["/running"] = State(2, "/running", self)
  413. # add children
  414. self.states[""].addChild(self.states["/creating_button"])
  415. self.states[""].addChild(self.states["/running"])
  416. self.states[""].fixTree()
  417. self.states[""].default_state = self.states["/creating_button"]
  418. # transition /creating_button
  419. _creating_button_0 = Transition(self, self.states["/creating_button"], [self.states["/running"]])
  420. _creating_button_0.setAction(self._creating_button_0_exec)
  421. _creating_button_0.setTrigger(Event("button_created", None))
  422. self.states["/creating_button"].addTransition(_creating_button_0)
  423. # transition /running
  424. _running_0 = Transition(self, self.states["/running"], [self.states["/running"]])
  425. _running_0.setAction(self._running_0_exec)
  426. _running_0.setTrigger(Event("mouse_click", self.getInPortName("button_ui")))
  427. _running_0.setGuard(self._running_0_guard)
  428. self.states["/running"].addTransition(_running_0)
  429. def _creating_button_enter(self):
  430. self.big_step.outputEvent(Event("create_button", self.getOutPortName("ui"), [self.window_id, self.event_name, self.inports['button_ui']]))
  431. def _creating_button_0_exec(self, parameters):
  432. button_id = parameters[0]
  433. self.button_id = button_id
  434. self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [button_id, ui.EVENTS.MOUSE_CLICK, "mouse_click", self.inports['button_ui']]))
  435. def _running_0_exec(self, parameters):
  436. x = parameters[0]
  437. y = parameters[1]
  438. button = parameters[2]
  439. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("button_pressed", None, [self.event_name])]))
  440. def _running_0_guard(self, parameters):
  441. x = parameters[0]
  442. y = parameters[1]
  443. button = parameters[2]
  444. return button == ui.MOUSE_BUTTONS.LEFT
  445. def initializeStatechart(self):
  446. # enter default state
  447. self.default_targets = self.states["/creating_button"].getEffectiveTargetStates()
  448. RuntimeClassBase.initializeStatechart(self)
  449. class Button(ClassBase):
  450. def __init__(self, name):
  451. ClassBase.__init__(self, name)
  452. self.input = self.addInPort("input")
  453. self.glob_outputs["ui"] = self.addOutPort("ui")
  454. self.button_ui = self.addInPort("button_ui")
  455. def constructObject(self, id, start_port_id, parameters):
  456. new_instance = ButtonInstance(self, id, start_port_id, parameters[1], parameters[2], parameters[3])
  457. return new_instance
  458. class BallInstance(RuntimeClassBase):
  459. def __init__(self, atomdevs, id, start_port_id, canvas_id, x, y):
  460. RuntimeClassBase.__init__(self, atomdevs, id)
  461. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  462. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  463. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  464. self.semantics.priority = StatechartSemantics.SourceParent
  465. self.semantics.concurrency = StatechartSemantics.Single
  466. # build Statechart structure
  467. self.build_statechart_structure()
  468. # user defined attributes
  469. self.canvas_id = None
  470. self.pos = None
  471. # call user defined constructor
  472. BallInstance.user_defined_constructor(self, canvas_id, x, y)
  473. port_name = addInputPort("ui", start_port_id, True)
  474. atomdevs.state.port_mappings[port_name] = None
  475. port_name = addInputPort("<narrow_cast>", start_port_id)
  476. atomdevs.state.port_mappings[port_name] = id
  477. port_name = addInputPort("ball_ui", start_port_id + 1)
  478. atomdevs.state.port_mappings[port_name] = id
  479. self.inports["ball_ui"] = port_name
  480. def user_defined_constructor(self, canvas_id, x, y):
  481. self.canvas_id = canvas_id;
  482. self.r = 20.0;
  483. self.vel = {'x': random.uniform(-5.0, 5.0), 'y': random.uniform(-5.0, 5.0)};
  484. self.pos = {'x': x, 'y': y};
  485. self.smooth = 0.6; # value between 0 and 1
  486. def user_defined_destructor(self):
  487. pass
  488. # builds Statechart structure
  489. def build_statechart_structure(self):
  490. # state <root>
  491. self.states[""] = State(0, "", self)
  492. # state /main_behaviour
  493. self.states["/main_behaviour"] = State(1, "/main_behaviour", self)
  494. # state /main_behaviour/initializing
  495. self.states["/main_behaviour/initializing"] = State(2, "/main_behaviour/initializing", self)
  496. # state /main_behaviour/creating_circle
  497. self.states["/main_behaviour/creating_circle"] = State(3, "/main_behaviour/creating_circle", self)
  498. self.states["/main_behaviour/creating_circle"].setEnter(self._main_behaviour_creating_circle_enter)
  499. # state /main_behaviour/bouncing
  500. self.states["/main_behaviour/bouncing"] = State(4, "/main_behaviour/bouncing", self)
  501. self.states["/main_behaviour/bouncing"].setEnter(self._main_behaviour_bouncing_enter)
  502. self.states["/main_behaviour/bouncing"].setExit(self._main_behaviour_bouncing_exit)
  503. # state /main_behaviour/dragging
  504. self.states["/main_behaviour/dragging"] = State(5, "/main_behaviour/dragging", self)
  505. # state /main_behaviour/selected
  506. self.states["/main_behaviour/selected"] = State(6, "/main_behaviour/selected", self)
  507. # state /deleted
  508. self.states["/deleted"] = State(7, "/deleted", self)
  509. # add children
  510. self.states[""].addChild(self.states["/main_behaviour"])
  511. self.states[""].addChild(self.states["/deleted"])
  512. self.states["/main_behaviour"].addChild(self.states["/main_behaviour/initializing"])
  513. self.states["/main_behaviour"].addChild(self.states["/main_behaviour/creating_circle"])
  514. self.states["/main_behaviour"].addChild(self.states["/main_behaviour/bouncing"])
  515. self.states["/main_behaviour"].addChild(self.states["/main_behaviour/dragging"])
  516. self.states["/main_behaviour"].addChild(self.states["/main_behaviour/selected"])
  517. self.states[""].fixTree()
  518. self.states[""].default_state = self.states["/main_behaviour"]
  519. self.states["/main_behaviour"].default_state = self.states["/main_behaviour/initializing"]
  520. # transition /main_behaviour/initializing
  521. _main_behaviour_initializing_0 = Transition(self, self.states["/main_behaviour/initializing"], [self.states["/main_behaviour/creating_circle"]])
  522. _main_behaviour_initializing_0.setAction(self._main_behaviour_initializing_0_exec)
  523. _main_behaviour_initializing_0.setTrigger(Event("set_association_name", None))
  524. self.states["/main_behaviour/initializing"].addTransition(_main_behaviour_initializing_0)
  525. # transition /main_behaviour/creating_circle
  526. _main_behaviour_creating_circle_0 = Transition(self, self.states["/main_behaviour/creating_circle"], [self.states["/main_behaviour/bouncing"]])
  527. _main_behaviour_creating_circle_0.setAction(self._main_behaviour_creating_circle_0_exec)
  528. _main_behaviour_creating_circle_0.setTrigger(Event("circle_created", None))
  529. self.states["/main_behaviour/creating_circle"].addTransition(_main_behaviour_creating_circle_0)
  530. # transition /main_behaviour/bouncing
  531. _main_behaviour_bouncing_0 = Transition(self, self.states["/main_behaviour/bouncing"], [self.states["/main_behaviour/bouncing"]])
  532. _main_behaviour_bouncing_0.setAction(self._main_behaviour_bouncing_0_exec)
  533. _main_behaviour_bouncing_0.setTrigger(Event("_0after"))
  534. self.states["/main_behaviour/bouncing"].addTransition(_main_behaviour_bouncing_0)
  535. _main_behaviour_bouncing_1 = Transition(self, self.states["/main_behaviour/bouncing"], [self.states["/main_behaviour/selected"]])
  536. _main_behaviour_bouncing_1.setAction(self._main_behaviour_bouncing_1_exec)
  537. _main_behaviour_bouncing_1.setTrigger(Event("mouse_press", self.getInPortName("ball_ui")))
  538. _main_behaviour_bouncing_1.setGuard(self._main_behaviour_bouncing_1_guard)
  539. self.states["/main_behaviour/bouncing"].addTransition(_main_behaviour_bouncing_1)
  540. # transition /main_behaviour/dragging
  541. _main_behaviour_dragging_0 = Transition(self, self.states["/main_behaviour/dragging"], [self.states["/main_behaviour/dragging"]])
  542. _main_behaviour_dragging_0.setAction(self._main_behaviour_dragging_0_exec)
  543. _main_behaviour_dragging_0.setTrigger(Event("mouse_move", self.getInPortName("ball_ui")))
  544. self.states["/main_behaviour/dragging"].addTransition(_main_behaviour_dragging_0)
  545. _main_behaviour_dragging_1 = Transition(self, self.states["/main_behaviour/dragging"], [self.states["/main_behaviour/bouncing"]])
  546. _main_behaviour_dragging_1.setAction(self._main_behaviour_dragging_1_exec)
  547. _main_behaviour_dragging_1.setTrigger(Event("mouse_release", self.getInPortName("ball_ui")))
  548. self.states["/main_behaviour/dragging"].addTransition(_main_behaviour_dragging_1)
  549. # transition /main_behaviour/selected
  550. _main_behaviour_selected_0 = Transition(self, self.states["/main_behaviour/selected"], [self.states["/main_behaviour/dragging"]])
  551. _main_behaviour_selected_0.setAction(self._main_behaviour_selected_0_exec)
  552. _main_behaviour_selected_0.setTrigger(Event("mouse_press", self.getInPortName("ball_ui")))
  553. _main_behaviour_selected_0.setGuard(self._main_behaviour_selected_0_guard)
  554. self.states["/main_behaviour/selected"].addTransition(_main_behaviour_selected_0)
  555. _main_behaviour_selected_1 = Transition(self, self.states["/main_behaviour/selected"], [self.states["/deleted"]])
  556. _main_behaviour_selected_1.setAction(self._main_behaviour_selected_1_exec)
  557. _main_behaviour_selected_1.setTrigger(Event("delete_self", None))
  558. self.states["/main_behaviour/selected"].addTransition(_main_behaviour_selected_1)
  559. def _main_behaviour_creating_circle_enter(self):
  560. self.big_step.outputEvent(Event("create_circle", self.getOutPortName("ui"), [self.canvas_id, self.pos['x'], self.pos['y'], self.r, {'fill':'#000'}, self.inports['ball_ui']]))
  561. def _main_behaviour_bouncing_enter(self):
  562. self.addTimer(0, 0.02)
  563. def _main_behaviour_bouncing_exit(self):
  564. self.removeTimer(0)
  565. def _main_behaviour_initializing_0_exec(self, parameters):
  566. association_name = parameters[0]
  567. self.association_name = association_name
  568. def _main_behaviour_creating_circle_0_exec(self, parameters):
  569. canvas_id = parameters[0]
  570. circle_id = parameters[1]
  571. self.circle_id = circle_id
  572. self.big_step.outputEvent(Event("bind_canvas_event", self.getOutPortName("ui"), [self.canvas_id, circle_id, ui.EVENTS.MOUSE_PRESS, 'mouse_press', self.inports['ball_ui']]))
  573. self.big_step.outputEvent(Event("bind_canvas_event", self.getOutPortName("ui"), [self.canvas_id, circle_id, ui.EVENTS.MOUSE_MOVE, 'mouse_move', self.inports['ball_ui']]))
  574. self.big_step.outputEvent(Event("bind_canvas_event", self.getOutPortName("ui"), [self.canvas_id, circle_id, ui.EVENTS.MOUSE_RELEASE, 'mouse_release', self.inports['ball_ui']]))
  575. def _main_behaviour_bouncing_0_exec(self, parameters):
  576. # Invert velocity when colliding with canvas border:
  577. if self.pos['x']-self.r <= 0 or self.pos['x']+self.r >= CANVAS_DIMS[0]:
  578. self.vel['x'] = -self.vel['x'];
  579. if self.pos['y']-self.r <= 0 or self.pos['y']+self.r >= CANVAS_DIMS[1]:
  580. self.vel['y'] = -self.vel['y'];
  581. self.big_step.outputEvent(Event("move_element", self.getOutPortName("ui"), [self.canvas_id, self.circle_id, self.vel['x'], self.vel['y']]))
  582. self.pos['x'] += self.vel['x']
  583. self.pos['y'] += self.vel['y']
  584. def _main_behaviour_bouncing_1_exec(self, parameters):
  585. x = parameters[0]
  586. y = parameters[1]
  587. button = parameters[2]
  588. self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.circle_id, '#ff0']))
  589. def _main_behaviour_bouncing_1_guard(self, parameters):
  590. x = parameters[0]
  591. y = parameters[1]
  592. button = parameters[2]
  593. return button == ui.MOUSE_BUTTONS.LEFT
  594. def _main_behaviour_dragging_0_exec(self, parameters):
  595. x = parameters[0]
  596. y = parameters[1]
  597. button = parameters[2]
  598. # Always keep ball within canvas:
  599. x = min(max(0+self.r, x), CANVAS_DIMS[0]-self.r)
  600. y = min(max(0+self.r, y), CANVAS_DIMS[1]-self.r)
  601. dx = x - self.pos['x']
  602. dy = y - self.pos['y']
  603. self.vel = {
  604. 'x': (1-self.smooth)*dx + self.smooth*self.vel['x'],
  605. 'y': (1-self.smooth)*dy + self.smooth*self.vel['y']
  606. }
  607. self.pos = {'x': x, 'y': y}
  608. self.big_step.outputEvent(Event("set_element_pos", self.getOutPortName("ui"), [self.canvas_id, self.circle_id, x-self.r, y-self.r]))
  609. def _main_behaviour_dragging_1_exec(self, parameters):
  610. x = parameters[0]
  611. y = parameters[1]
  612. self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.circle_id, '#f00']))
  613. def _main_behaviour_selected_0_exec(self, parameters):
  614. x = parameters[0]
  615. y = parameters[1]
  616. button = parameters[2]
  617. self.mouse_pos = {'x':x, 'y':y};
  618. def _main_behaviour_selected_0_guard(self, parameters):
  619. x = parameters[0]
  620. y = parameters[1]
  621. button = parameters[2]
  622. return button == ui.MOUSE_BUTTONS.LEFT
  623. def _main_behaviour_selected_1_exec(self, parameters):
  624. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("delete_ball", None, [self.association_name])]))
  625. self.big_step.outputEvent(Event("destroy_element", self.getOutPortName("ui"), [self.canvas_id, self.element_id]))
  626. def initializeStatechart(self):
  627. # enter default state
  628. self.default_targets = self.states["/main_behaviour"].getEffectiveTargetStates()
  629. RuntimeClassBase.initializeStatechart(self)
  630. class Ball(ClassBase):
  631. def __init__(self, name):
  632. ClassBase.__init__(self, name)
  633. self.input = self.addInPort("input")
  634. self.glob_outputs["ui"] = self.addOutPort("ui")
  635. self.ball_ui = self.addInPort("ball_ui")
  636. def constructObject(self, id, start_port_id, parameters):
  637. new_instance = BallInstance(self, id, start_port_id, parameters[1], parameters[2], parameters[3])
  638. return new_instance
  639. def instantiate(self, class_name, construct_params):
  640. instance = {}
  641. instance["name"] = class_name
  642. if class_name == "MainApp":
  643. self.narrow_cast_id = self.narrow_cast_id + 0
  644. instance["associations"] = {}
  645. instance["associations"]["fields"] = Association("Field", 0, -1)
  646. elif class_name == "Field":
  647. self.narrow_cast_id = self.narrow_cast_id + 1
  648. instance["associations"] = {}
  649. instance["associations"]["balls"] = Association("Ball", 0, -1)
  650. instance["associations"]["buttons"] = Association("Button", 0, -1)
  651. instance["associations"]["parent"] = Association("MainApp", 1, 1)
  652. elif class_name == "Button":
  653. self.narrow_cast_id = self.narrow_cast_id + 1
  654. instance["associations"] = {}
  655. instance["associations"]["parent"] = Association("Field", 1, 1)
  656. elif class_name == "Ball":
  657. self.narrow_cast_id = self.narrow_cast_id + 1
  658. instance["associations"] = {}
  659. instance["associations"]["parent"] = Association("Field", 1, 1)
  660. else:
  661. raise Exception("Cannot instantiate class " + class_name)
  662. return instance
  663. ObjectManagerState.instantiate = instantiate
  664. class ObjectManager(ObjectManagerBase):
  665. def __init__(self, name):
  666. ObjectManagerBase.__init__(self, name)
  667. self.state = ObjectManagerState()
  668. self.input = self.addInPort("input")
  669. self.output["MainApp"] = self.addOutPort()
  670. self.output["Field"] = self.addOutPort()
  671. self.output["Button"] = self.addOutPort()
  672. self.output["Ball"] = self.addOutPort()
  673. self.state.createInstance("MainApp", [])
  674. class Controller(CoupledDEVS):
  675. def __init__(self, name):
  676. CoupledDEVS.__init__(self, name)
  677. self.in_ui = self.addInPort("ui")
  678. self.out_ui = self.addOutPort("ui")
  679. self.objectmanager = self.addSubModel(ObjectManager("ObjectManager"))
  680. self.atomics = []
  681. self.atomics.append(self.addSubModel(MainApp("MainApp")))
  682. self.atomics.append(self.addSubModel(Field("Field")))
  683. self.atomics.append(self.addSubModel(Button("Button")))
  684. self.atomics.append(self.addSubModel(Ball("Ball")))
  685. self.connectPorts(self.atomics[0].obj_manager_out, self.objectmanager.input)
  686. self.connectPorts(self.objectmanager.output["MainApp"], self.atomics[0].obj_manager_in)
  687. self.connectPorts(self.atomics[1].obj_manager_out, self.objectmanager.input)
  688. self.connectPorts(self.objectmanager.output["Field"], self.atomics[1].obj_manager_in)
  689. self.connectPorts(self.atomics[2].obj_manager_out, self.objectmanager.input)
  690. self.connectPorts(self.objectmanager.output["Button"], self.atomics[2].obj_manager_in)
  691. self.connectPorts(self.atomics[3].obj_manager_out, self.objectmanager.input)
  692. self.connectPorts(self.objectmanager.output["Ball"], self.atomics[3].obj_manager_in)
  693. self.connectPorts(self.atomics[0].glob_outputs["ui"], self.out_ui)
  694. self.connectPorts(self.in_ui, self.atomics[0].input)
  695. self.connectPorts(self.atomics[1].glob_outputs["ui"], self.out_ui)
  696. self.connectPorts(self.in_ui, self.atomics[1].input)
  697. self.connectPorts(self.atomics[2].glob_outputs["ui"], self.out_ui)
  698. self.connectPorts(self.in_ui, self.atomics[2].input)
  699. self.connectPorts(self.atomics[3].glob_outputs["ui"], self.out_ui)
  700. self.connectPorts(self.in_ui, self.atomics[3].input)