target.py 50 KB

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