thetarget.py 50 KB

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