the_target.py 49 KB

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