target.py 50 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998
  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: Elevator Balls
  5. """
  6. from sccd.runtime.DEVS_statecharts_core import *
  7. import sccd.runtime.libs.ui_v2 as ui
  8. import random
  9. import time
  10. CANVAS_DIMS = (800, 550)
  11. FLOOR_LENGTH = 350
  12. FLOOR_SPACE = 50
  13. FLOORS = 3
  14. # package "Elevator Balls"
  15. class MainAppInstance(RuntimeClassBase):
  16. def __init__(self, atomdevs):
  17. RuntimeClassBase.__init__(self, atomdevs)
  18. self.associations = {}
  19. self.associations["floor"] = Association("Floor", 2, -1)
  20. self.associations["button"] = Association("ElevatorButton", 0, -1)
  21. self.associations["elevator"] = Association("Elevator", 1, 1)
  22. self.associations["ball"] = Association("Ball", 0, -1)
  23. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  24. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  25. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  26. self.semantics.priority = StatechartSemantics.SourceParent
  27. self.semantics.concurrency = StatechartSemantics.Single
  28. # build Statechart structure
  29. self.build_statechart_structure()
  30. # user defined attributes
  31. self.window_id = None
  32. self.canvas_id = None
  33. self.num_floors = None
  34. self.floor_dimensions = None
  35. # call user defined constructor
  36. MainAppInstance.user_defined_constructor(self)
  37. port_name = Ports.addInputPort("<narrow_cast>", self)
  38. atomdevs.addInPort(port_name)
  39. port_name = Ports.addInputPort("field_ui", self)
  40. atomdevs.addInPort(port_name)
  41. atomdevs.port_mappings[port_name] = atomdevs.next_instance
  42. self.inports["field_ui"] = port_name
  43. def user_defined_constructor(self):
  44. self.num_floors = 0
  45. self.button_num = FLOORS
  46. self.elevator_pos = None
  47. self.elevator_dim = None
  48. def user_defined_destructor(self):
  49. pass
  50. # builds Statechart structure
  51. def build_statechart_structure(self):
  52. # state <root>
  53. self.states[""] = State(0, "", self)
  54. # state /creating_window
  55. self.states["/creating_window"] = State(1, "/creating_window", self)
  56. self.states["/creating_window"].setEnter(self._creating_window_enter)
  57. # state /creating_canvas
  58. self.states["/creating_canvas"] = State(2, "/creating_canvas", self)
  59. self.states["/creating_canvas"].setEnter(self._creating_canvas_enter)
  60. # state /create_floors
  61. self.states["/create_floors"] = State(3, "/create_floors", self)
  62. # state /wait
  63. self.states["/wait"] = State(4, "/wait", self)
  64. # state /create_controls
  65. self.states["/create_controls"] = State(5, "/create_controls", self)
  66. # state /create_controls/create_buttons
  67. self.states["/create_controls/create_buttons"] = State(6, "/create_controls/create_buttons", self)
  68. # state /create_controls/create_buttons/create_a_button
  69. self.states["/create_controls/create_buttons/create_a_button"] = State(7, "/create_controls/create_buttons/create_a_button", self)
  70. self.states["/create_controls/create_buttons/create_a_button"].setEnter(self._create_controls_create_buttons_create_a_button_enter)
  71. # state /create_controls/create_buttons/start_a_button
  72. self.states["/create_controls/create_buttons/start_a_button"] = State(8, "/create_controls/create_buttons/start_a_button", self)
  73. # state /create_controls/create_buttons/check_next
  74. self.states["/create_controls/create_buttons/check_next"] = State(9, "/create_controls/create_buttons/check_next", self)
  75. # state /create_elevator
  76. self.states["/create_elevator"] = State(10, "/create_elevator", self)
  77. # state /creating
  78. self.states["/creating"] = State(11, "/creating", self)
  79. # state /running
  80. self.states["/running"] = State(12, "/running", self)
  81. # add children
  82. self.states[""].addChild(self.states["/creating_window"])
  83. self.states[""].addChild(self.states["/creating_canvas"])
  84. self.states[""].addChild(self.states["/create_floors"])
  85. self.states[""].addChild(self.states["/wait"])
  86. self.states[""].addChild(self.states["/create_controls"])
  87. self.states[""].addChild(self.states["/create_elevator"])
  88. self.states[""].addChild(self.states["/creating"])
  89. self.states[""].addChild(self.states["/running"])
  90. self.states["/create_controls"].addChild(self.states["/create_controls/create_buttons"])
  91. self.states["/create_controls/create_buttons"].addChild(self.states["/create_controls/create_buttons/create_a_button"])
  92. self.states["/create_controls/create_buttons"].addChild(self.states["/create_controls/create_buttons/start_a_button"])
  93. self.states["/create_controls/create_buttons"].addChild(self.states["/create_controls/create_buttons/check_next"])
  94. self.states[""].fixTree()
  95. self.states[""].default_state = self.states["/creating_window"]
  96. self.states["/create_controls"].default_state = self.states["/create_controls/create_buttons"]
  97. self.states["/create_controls/create_buttons"].default_state = self.states["/create_controls/create_buttons/create_a_button"]
  98. # transition /creating_window
  99. _creating_window_0 = Transition(self, self.states["/creating_window"], [self.states["/creating_canvas"]])
  100. _creating_window_0.setAction(self._creating_window_0_exec)
  101. _creating_window_0.setTrigger(Event("window_created", None))
  102. self.states["/creating_window"].addTransition(_creating_window_0)
  103. # transition /creating_canvas
  104. _creating_canvas_0 = Transition(self, self.states["/creating_canvas"], [self.states["/create_floors"]])
  105. _creating_canvas_0.setAction(self._creating_canvas_0_exec)
  106. _creating_canvas_0.setTrigger(Event("canvas_created", None))
  107. self.states["/creating_canvas"].addTransition(_creating_canvas_0)
  108. # transition /create_floors
  109. _create_floors_0 = Transition(self, self.states["/create_floors"], [self.states["/create_controls"]])
  110. _create_floors_0.setTrigger(None)
  111. _create_floors_0.setGuard(self._create_floors_0_guard)
  112. self.states["/create_floors"].addTransition(_create_floors_0)
  113. _create_floors_1 = Transition(self, self.states["/create_floors"], [self.states["/wait"]])
  114. _create_floors_1.setAction(self._create_floors_1_exec)
  115. _create_floors_1.setTrigger(None)
  116. _create_floors_1.setGuard(self._create_floors_1_guard)
  117. self.states["/create_floors"].addTransition(_create_floors_1)
  118. # transition /wait
  119. _wait_0 = Transition(self, self.states["/wait"], [self.states["/wait"]])
  120. _wait_0.setAction(self._wait_0_exec)
  121. _wait_0.setTrigger(Event("instance_created", None))
  122. self.states["/wait"].addTransition(_wait_0)
  123. _wait_1 = Transition(self, self.states["/wait"], [self.states["/create_floors"]])
  124. _wait_1.setTrigger(Event("instance_started", None))
  125. self.states["/wait"].addTransition(_wait_1)
  126. # transition /create_controls/create_buttons/create_a_button
  127. _create_controls_create_buttons_create_a_button_0 = Transition(self, self.states["/create_controls/create_buttons/create_a_button"], [self.states["/create_controls/create_buttons/start_a_button"]])
  128. _create_controls_create_buttons_create_a_button_0.setAction(self._create_controls_create_buttons_create_a_button_0_exec)
  129. _create_controls_create_buttons_create_a_button_0.setTrigger(Event("instance_created", None))
  130. self.states["/create_controls/create_buttons/create_a_button"].addTransition(_create_controls_create_buttons_create_a_button_0)
  131. # transition /create_controls/create_buttons/start_a_button
  132. _create_controls_create_buttons_start_a_button_0 = Transition(self, self.states["/create_controls/create_buttons/start_a_button"], [self.states["/create_controls/create_buttons/check_next"]])
  133. _create_controls_create_buttons_start_a_button_0.setTrigger(Event("instance_started", None))
  134. self.states["/create_controls/create_buttons/start_a_button"].addTransition(_create_controls_create_buttons_start_a_button_0)
  135. # transition /create_controls/create_buttons/check_next
  136. _create_controls_create_buttons_check_next_0 = Transition(self, self.states["/create_controls/create_buttons/check_next"], [self.states["/create_controls/create_buttons/create_a_button"]])
  137. _create_controls_create_buttons_check_next_0.setAction(self._create_controls_create_buttons_check_next_0_exec)
  138. _create_controls_create_buttons_check_next_0.setTrigger(None)
  139. _create_controls_create_buttons_check_next_0.setGuard(self._create_controls_create_buttons_check_next_0_guard)
  140. self.states["/create_controls/create_buttons/check_next"].addTransition(_create_controls_create_buttons_check_next_0)
  141. _create_controls_create_buttons_check_next_1 = Transition(self, self.states["/create_controls/create_buttons/check_next"], [self.states["/create_elevator"]])
  142. _create_controls_create_buttons_check_next_1.setTrigger(None)
  143. _create_controls_create_buttons_check_next_1.setGuard(self._create_controls_create_buttons_check_next_1_guard)
  144. self.states["/create_controls/create_buttons/check_next"].addTransition(_create_controls_create_buttons_check_next_1)
  145. # transition /create_elevator
  146. _create_elevator_0 = Transition(self, self.states["/create_elevator"], [self.states["/creating"]])
  147. _create_elevator_0.setAction(self._create_elevator_0_exec)
  148. _create_elevator_0.setTrigger(None)
  149. self.states["/create_elevator"].addTransition(_create_elevator_0)
  150. # transition /creating
  151. _creating_0 = Transition(self, self.states["/creating"], [self.states["/running"]])
  152. _creating_0.setAction(self._creating_0_exec)
  153. _creating_0.setTrigger(Event("instance_created", None))
  154. self.states["/creating"].addTransition(_creating_0)
  155. # transition /running
  156. _running_0 = Transition(self, self.states["/running"], [self.states["/running"]])
  157. _running_0.setAction(self._running_0_exec)
  158. _running_0.setTrigger(Event("create_ball", None))
  159. self.states["/running"].addTransition(_running_0)
  160. _running_1 = Transition(self, self.states["/running"], [self.states["/running"]])
  161. _running_1.setAction(self._running_1_exec)
  162. _running_1.setTrigger(Event("instance_created", None))
  163. self.states["/running"].addTransition(_running_1)
  164. _running_2 = Transition(self, self.states["/running"], [self.states["/running"]])
  165. _running_2.setAction(self._running_2_exec)
  166. _running_2.setTrigger(Event("update_bounds", None))
  167. self.states["/running"].addTransition(_running_2)
  168. _running_3 = Transition(self, self.states["/running"], [self.states["/running"]])
  169. _running_3.setAction(self._running_3_exec)
  170. _running_3.setTrigger(Event("button_pressed", None))
  171. self.states["/running"].addTransition(_running_3)
  172. _running_4 = Transition(self, self.states["/running"], [self.states["/running"]])
  173. _running_4.setAction(self._running_4_exec)
  174. _running_4.setTrigger(Event("open_elevator", None))
  175. self.states["/running"].addTransition(_running_4)
  176. def _creating_window_enter(self):
  177. self.big_step.outputEvent(Event("create_window", self.getOutPortName("ui"), [CANVAS_DIMS[0], CANVAS_DIMS[1], "Bouncing Balls Elevator", self.inports['field_ui']]))
  178. def _creating_canvas_enter(self):
  179. self.big_step.outputEvent(Event("create_canvas", self.getOutPortName("ui"), [self.window_id, CANVAS_DIMS[0], CANVAS_DIMS[1] - 150, {'background':'#fff'}, self.inports['field_ui']]))
  180. def _create_controls_create_buttons_create_a_button_enter(self):
  181. self.big_step.outputEventOM(Event("create_instance", None, [self, "button", "ElevatorButton", self.window_id, self.canvas_id, self.button_num - 1]))
  182. def _creating_window_0_exec(self, parameters):
  183. window_id = parameters[0]
  184. self.window_id = window_id
  185. self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [window_id, ui.EVENTS.WINDOW_CLOSE, 'window_close', self.inports['field_ui']]))
  186. self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [window_id, ui.EVENTS.KEY_PRESS, 'key_press', self.inports['field_ui']]))
  187. def _creating_canvas_0_exec(self, parameters):
  188. canvas_id = parameters[0]
  189. self.canvas_id = canvas_id
  190. def _create_floors_0_guard(self, parameters):
  191. return self.num_floors == FLOORS
  192. def _create_floors_1_exec(self, parameters):
  193. self.big_step.outputEventOM(Event("create_instance", None, [self, "floor", "Floor", self.canvas_id, self.num_floors]))
  194. self.num_floors += 1
  195. def _create_floors_1_guard(self, parameters):
  196. return self.num_floors != FLOORS
  197. def _wait_0_exec(self, parameters):
  198. association_name = parameters[0]
  199. self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
  200. def _create_controls_create_buttons_create_a_button_0_exec(self, parameters):
  201. association_name = parameters[0]
  202. self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
  203. def _create_controls_create_buttons_check_next_0_exec(self, parameters):
  204. self.button_num -= 1
  205. def _create_controls_create_buttons_check_next_0_guard(self, parameters):
  206. return self.button_num != 1
  207. def _create_controls_create_buttons_check_next_1_guard(self, parameters):
  208. return self.button_num == 1
  209. def _create_elevator_0_exec(self, parameters):
  210. self.big_step.outputEventOM(Event("create_instance", None, [self, "elevator", "Elevator", self.canvas_id]))
  211. def _creating_0_exec(self, parameters):
  212. association_name = parameters[0]
  213. self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
  214. self.big_step.outputEventOM(Event("narrow_cast", None, [self, association_name, Event("set_association_name", None, [association_name, self.canvas_id, self.window_id])]))
  215. def _running_0_exec(self, parameters):
  216. floor_num = parameters[0]
  217. x = parameters[1]
  218. y = parameters[2]
  219. self.big_step.outputEventOM(Event("create_instance", None, [self, "ball", "Ball", self.canvas_id, floor_num, x, y, self.elevator_pos, self.elevator_dim]))
  220. def _running_1_exec(self, parameters):
  221. association_name = parameters[0]
  222. self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
  223. self.big_step.outputEventOM(Event("narrow_cast", None, [self, association_name, Event("set_association_name", None, [association_name])]))
  224. def _running_2_exec(self, parameters):
  225. pos = parameters[0]
  226. dim = parameters[1]
  227. vel = parameters[2]
  228. self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("update_elevator_bounds", None, [pos, dim, vel])]))
  229. def _running_3_exec(self, parameters):
  230. floor_number = parameters[0]
  231. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'elevator', Event("move_elevator", None, [floor_number])]))
  232. def _running_4_exec(self, parameters):
  233. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'ball', Event("open_elevator", None, [])]))
  234. def initializeStatechart(self):
  235. # enter default state
  236. self.default_targets = self.states["/creating_window"].getEffectiveTargetStates()
  237. RuntimeClassBase.initializeStatechart(self)
  238. class MainApp(ObjectManagerBase):
  239. def __init__(self, name):
  240. ObjectManagerBase.__init__(self, name)
  241. self.input = self.addInPort("input")
  242. self.output = self.addOutPort("ui")
  243. self.outputs["floor"] = self.addOutPort("floor")
  244. self.outputs["button"] = self.addOutPort("button")
  245. self.outputs["elevator"] = self.addOutPort("elevator")
  246. self.outputs["ball"] = self.addOutPort("ball")
  247. self.field_ui = self.addInPort("field_ui")
  248. self.instances[self.next_instance] = MainAppInstance(self)
  249. self.next_instance = self.next_instance + 1
  250. def constructObject(self, parameters):
  251. new_instance = MainAppInstance(self)
  252. return new_instance
  253. class FloorInstance(RuntimeClassBase):
  254. def __init__(self, atomdevs, canvas_id, floor_num):
  255. RuntimeClassBase.__init__(self, atomdevs)
  256. self.associations = {}
  257. self.associations["parent"] = Association("MainApp", 1, 1)
  258. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  259. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  260. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  261. self.semantics.priority = StatechartSemantics.SourceParent
  262. self.semantics.concurrency = StatechartSemantics.Single
  263. # build Statechart structure
  264. self.build_statechart_structure()
  265. # user defined attributes
  266. self.window_id = None
  267. self.canvas_id = None
  268. self.elevator_id = None
  269. # call user defined constructor
  270. FloorInstance.user_defined_constructor(self, canvas_id, floor_num)
  271. port_name = Ports.addInputPort("<narrow_cast>", self)
  272. atomdevs.addInPort(port_name)
  273. port_name = Ports.addInputPort("floor_ui", self)
  274. atomdevs.addInPort(port_name)
  275. atomdevs.port_mappings[port_name] = atomdevs.next_instance
  276. self.inports["floor_ui"] = port_name
  277. def user_defined_constructor(self, canvas_id, floor_num):
  278. self.canvas_id = canvas_id;
  279. self.floor_num = floor_num;
  280. height = CANVAS_DIMS[1] - 150
  281. y_dim = (height - ((FLOORS - 1) * FLOOR_SPACE)) / FLOORS
  282. self.dim = {'x': FLOOR_LENGTH, 'y': y_dim};
  283. # start position from the bottom instead of from the top
  284. # self.pos = {'x': FLOOR_LENGTH / 2, 'y': (y_dim /2) + (self.floor_num * (y_dim + FLOOR_SPACE))};
  285. self.pos = {'x': FLOOR_LENGTH / 2, 'y': height - (y_dim /2) - ( self.floor_num * (y_dim + FLOOR_SPACE) )};
  286. def user_defined_destructor(self):
  287. pass
  288. # builds Statechart structure
  289. def build_statechart_structure(self):
  290. # state <root>
  291. self.states[""] = State(0, "", self)
  292. # state /creating_floor
  293. self.states["/creating_floor"] = State(1, "/creating_floor", self)
  294. self.states["/creating_floor"].setEnter(self._creating_floor_enter)
  295. # state /running
  296. self.states["/running"] = State(2, "/running", self)
  297. # state /running/create_random_ball
  298. self.states["/running/create_random_ball"] = State(3, "/running/create_random_ball", self)
  299. self.states["/running/create_random_ball"].setEnter(self._running_create_random_ball_enter)
  300. self.states["/running/create_random_ball"].setExit(self._running_create_random_ball_exit)
  301. # add children
  302. self.states[""].addChild(self.states["/creating_floor"])
  303. self.states[""].addChild(self.states["/running"])
  304. self.states["/running"].addChild(self.states["/running/create_random_ball"])
  305. self.states[""].fixTree()
  306. self.states[""].default_state = self.states["/creating_floor"]
  307. self.states["/running"].default_state = self.states["/running/create_random_ball"]
  308. # transition /creating_floor
  309. _creating_floor_0 = Transition(self, self.states["/creating_floor"], [self.states["/running"]])
  310. _creating_floor_0.setTrigger(Event("rectangle_created", None))
  311. self.states["/creating_floor"].addTransition(_creating_floor_0)
  312. # transition /running/create_random_ball
  313. _running_create_random_ball_0 = Transition(self, self.states["/running/create_random_ball"], [self.states["/running/create_random_ball"]])
  314. _running_create_random_ball_0.setAction(self._running_create_random_ball_0_exec)
  315. _running_create_random_ball_0.setTrigger(Event("_0after"))
  316. self.states["/running/create_random_ball"].addTransition(_running_create_random_ball_0)
  317. def _creating_floor_enter(self):
  318. self.big_step.outputEvent(Event("create_rectangle", self.getOutPortName("ui"), [self.canvas_id, self.pos['x'], self.pos['y'], self.dim['x'], self.dim['y'], {'fill':'white', 'outline': 'black'}, self.inports['floor_ui']]))
  319. def _running_create_random_ball_enter(self):
  320. self.addTimer(0, random.randint(2, 10))
  321. def _running_create_random_ball_exit(self):
  322. self.removeTimer(0)
  323. def _running_create_random_ball_0_exec(self, parameters):
  324. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("create_ball", None, [self.floor_num, 10, self.pos['y']])]))
  325. def initializeStatechart(self):
  326. # enter default state
  327. self.default_targets = self.states["/creating_floor"].getEffectiveTargetStates()
  328. RuntimeClassBase.initializeStatechart(self)
  329. class Floor(ObjectManagerBase):
  330. def __init__(self, name):
  331. ObjectManagerBase.__init__(self, name)
  332. self.input = self.addInPort("input")
  333. self.output = self.addOutPort("ui")
  334. self.outputs["parent"] = self.addOutPort("parent")
  335. self.floor_ui = self.addInPort("floor_ui")
  336. def constructObject(self, parameters):
  337. new_instance = FloorInstance(self, parameters[2], parameters[3])
  338. return new_instance
  339. class ElevatorButtonInstance(RuntimeClassBase):
  340. def __init__(self, atomdevs, window_id, canvas_id, number):
  341. RuntimeClassBase.__init__(self, atomdevs)
  342. self.associations = {}
  343. self.associations["parent"] = Association("MainApp", 1, 1)
  344. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  345. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  346. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  347. self.semantics.priority = StatechartSemantics.SourceParent
  348. self.semantics.concurrency = StatechartSemantics.Single
  349. # build Statechart structure
  350. self.build_statechart_structure()
  351. # call user defined constructor
  352. ElevatorButtonInstance.user_defined_constructor(self, window_id, canvas_id, number)
  353. port_name = Ports.addInputPort("<narrow_cast>", self)
  354. atomdevs.addInPort(port_name)
  355. port_name = Ports.addInputPort("button_ui", self)
  356. atomdevs.addInPort(port_name)
  357. atomdevs.port_mappings[port_name] = atomdevs.next_instance
  358. self.inports["button_ui"] = port_name
  359. def user_defined_constructor(self, window_id, canvas_id, number):
  360. self.window_id = window_id;
  361. self.canvas_id = canvas_id;
  362. self.button_id = None;
  363. self.dim = {'x': 120, 'y': (50 + (FLOORS * 30))}
  364. self.pos = {'x': CANVAS_DIMS[0] - ((self.dim['x'] / 2) + 10), 'y': (self.dim['y'] / 2) + 10}
  365. self.r = 10
  366. self.number = number;
  367. def user_defined_destructor(self):
  368. pass
  369. # builds Statechart structure
  370. def build_statechart_structure(self):
  371. # state <root>
  372. self.states[""] = State(0, "", self)
  373. # state /creating
  374. self.states["/creating"] = State(1, "/creating", self)
  375. self.states["/creating"].setEnter(self._creating_enter)
  376. # state /running
  377. self.states["/running"] = State(2, "/running", self)
  378. # add children
  379. self.states[""].addChild(self.states["/creating"])
  380. self.states[""].addChild(self.states["/running"])
  381. self.states[""].fixTree()
  382. self.states[""].default_state = self.states["/creating"]
  383. # transition /creating
  384. _creating_0 = Transition(self, self.states["/creating"], [self.states["/running"]])
  385. _creating_0.setAction(self._creating_0_exec)
  386. _creating_0.setTrigger(Event("button_created", None))
  387. self.states["/creating"].addTransition(_creating_0)
  388. # transition /running
  389. _running_0 = Transition(self, self.states["/running"], [self.states["/running"]])
  390. _running_0.setAction(self._running_0_exec)
  391. _running_0.setTrigger(Event("mouse_click", self.getInPortName("button_ui")))
  392. _running_0.setGuard(self._running_0_guard)
  393. self.states["/running"].addTransition(_running_0)
  394. def _creating_enter(self):
  395. self.big_step.outputEvent(Event("create_button", self.getOutPortName("ui"), [self.window_id, self.number, self.inports['button_ui']]))
  396. def _creating_0_exec(self, parameters):
  397. button_id = parameters[0]
  398. self.button_id = button_id
  399. self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [button_id, ui.EVENTS.MOUSE_CLICK, "mouse_click", self.inports['button_ui']]))
  400. def _running_0_exec(self, parameters):
  401. x = parameters[0]
  402. y = parameters[1]
  403. button = parameters[2]
  404. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("button_pressed", None, [self.number])]))
  405. def _running_0_guard(self, parameters):
  406. x = parameters[0]
  407. y = parameters[1]
  408. button = parameters[2]
  409. return button == ui.MOUSE_BUTTONS.LEFT
  410. def initializeStatechart(self):
  411. # enter default state
  412. self.default_targets = self.states["/creating"].getEffectiveTargetStates()
  413. RuntimeClassBase.initializeStatechart(self)
  414. class ElevatorButton(ObjectManagerBase):
  415. def __init__(self, name):
  416. ObjectManagerBase.__init__(self, name)
  417. self.input = self.addInPort("input")
  418. self.output = self.addOutPort("ui")
  419. self.outputs["parent"] = self.addOutPort("parent")
  420. self.button_ui = self.addInPort("button_ui")
  421. def constructObject(self, parameters):
  422. new_instance = ElevatorButtonInstance(self, parameters[2], parameters[3], parameters[4])
  423. return new_instance
  424. class ElevatorInstance(RuntimeClassBase):
  425. def __init__(self, atomdevs, canvas_id):
  426. RuntimeClassBase.__init__(self, atomdevs)
  427. self.associations = {}
  428. self.associations["floors"] = Association("Floor", 1, 1)
  429. self.associations["parent"] = Association("MainApp", 1, 1)
  430. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  431. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  432. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  433. self.semantics.priority = StatechartSemantics.SourceParent
  434. self.semantics.concurrency = StatechartSemantics.Single
  435. # build Statechart structure
  436. self.build_statechart_structure()
  437. # user defined attributes
  438. self.window_id = None
  439. self.canvas_id = None
  440. self.elevator_id = None
  441. # call user defined constructor
  442. ElevatorInstance.user_defined_constructor(self, canvas_id)
  443. port_name = Ports.addInputPort("<narrow_cast>", self)
  444. atomdevs.addInPort(port_name)
  445. port_name = Ports.addInputPort("elevator_ui", self)
  446. atomdevs.addInPort(port_name)
  447. atomdevs.port_mappings[port_name] = atomdevs.next_instance
  448. self.inports["elevator_ui"] = port_name
  449. def user_defined_constructor(self, canvas_id):
  450. self.canvas_id = canvas_id;
  451. height = CANVAS_DIMS[1] - 150
  452. elevator_height = (height - ((FLOORS - 1) * FLOOR_SPACE)) / FLOORS
  453. self.dim = {'x': elevator_height, 'y': elevator_height};
  454. self.vel = -2;
  455. self.current_floor = 0;
  456. self.pos = {'x': FLOOR_LENGTH + (elevator_height / 2), 'y': (height - (elevator_height / 2))};
  457. self.next_pos = {'x': FLOOR_LENGTH / 2, 'y': None};
  458. self.smooth = 0.6; # value between 0 and 1
  459. def user_defined_destructor(self):
  460. pass
  461. # builds Statechart structure
  462. def build_statechart_structure(self):
  463. # state <root>
  464. self.states[""] = State(0, "", self)
  465. # state /root
  466. self.states["/root"] = State(1, "/root", self)
  467. # state /root/waiting
  468. self.states["/root/waiting"] = State(2, "/root/waiting", self)
  469. # state /root/creating_elevator
  470. self.states["/root/creating_elevator"] = State(3, "/root/creating_elevator", self)
  471. self.states["/root/creating_elevator"].setEnter(self._root_creating_elevator_enter)
  472. # state /root/running
  473. self.states["/root/running"] = State(4, "/root/running", self)
  474. # state /root/running/idle
  475. self.states["/root/running/idle"] = State(5, "/root/running/idle", self)
  476. self.states["/root/running/idle"].setEnter(self._root_running_idle_enter)
  477. # state /root/running/move
  478. self.states["/root/running/move"] = State(6, "/root/running/move", self)
  479. self.states["/root/running/move"].setEnter(self._root_running_move_enter)
  480. self.states["/root/running/move"].setExit(self._root_running_move_exit)
  481. # add children
  482. self.states[""].addChild(self.states["/root"])
  483. self.states["/root"].addChild(self.states["/root/waiting"])
  484. self.states["/root"].addChild(self.states["/root/creating_elevator"])
  485. self.states["/root"].addChild(self.states["/root/running"])
  486. self.states["/root/running"].addChild(self.states["/root/running/idle"])
  487. self.states["/root/running"].addChild(self.states["/root/running/move"])
  488. self.states[""].fixTree()
  489. self.states[""].default_state = self.states["/root"]
  490. self.states["/root"].default_state = self.states["/root/waiting"]
  491. self.states["/root/running"].default_state = self.states["/root/running/idle"]
  492. # transition /root/waiting
  493. _root_waiting_0 = Transition(self, self.states["/root/waiting"], [self.states["/root/creating_elevator"]])
  494. _root_waiting_0.setAction(self._root_waiting_0_exec)
  495. _root_waiting_0.setTrigger(Event("set_association_name", None))
  496. self.states["/root/waiting"].addTransition(_root_waiting_0)
  497. # transition /root/creating_elevator
  498. _root_creating_elevator_0 = Transition(self, self.states["/root/creating_elevator"], [self.states["/root/running"]])
  499. _root_creating_elevator_0.setAction(self._root_creating_elevator_0_exec)
  500. _root_creating_elevator_0.setTrigger(Event("rectangle_created", None))
  501. self.states["/root/creating_elevator"].addTransition(_root_creating_elevator_0)
  502. # transition /root/running/idle
  503. _root_running_idle_0 = Transition(self, self.states["/root/running/idle"], [self.states["/root/running/move"]])
  504. _root_running_idle_0.setAction(self._root_running_idle_0_exec)
  505. _root_running_idle_0.setTrigger(Event("move_elevator", None))
  506. self.states["/root/running/idle"].addTransition(_root_running_idle_0)
  507. # transition /root/running/move
  508. _root_running_move_0 = Transition(self, self.states["/root/running/move"], [self.states["/root/running/move"]])
  509. _root_running_move_0.setAction(self._root_running_move_0_exec)
  510. _root_running_move_0.setTrigger(Event("_0after"))
  511. self.states["/root/running/move"].addTransition(_root_running_move_0)
  512. _root_running_move_1 = Transition(self, self.states["/root/running/move"], [self.states["/root/running/idle"]])
  513. _root_running_move_1.setAction(self._root_running_move_1_exec)
  514. _root_running_move_1.setTrigger(None)
  515. _root_running_move_1.setGuard(self._root_running_move_1_guard)
  516. self.states["/root/running/move"].addTransition(_root_running_move_1)
  517. def _root_creating_elevator_enter(self):
  518. self.big_step.outputEvent(Event("create_rectangle", self.getOutPortName("ui"), [self.canvas_id, self.pos['x'], self.pos['y'], self.dim['x'], self.dim['y'], {'fill':'white', 'outline': 'black'}, self.inports['elevator_ui']]))
  519. def _root_running_idle_enter(self):
  520. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("update_bounds", None, [self.pos, self.dim, self.vel])]))
  521. def _root_running_move_enter(self):
  522. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("update_bounds", None, [self.pos, self.dim, self.vel])]))
  523. self.addTimer(0, 0.02)
  524. def _root_running_move_exit(self):
  525. self.removeTimer(0)
  526. def _root_waiting_0_exec(self, parameters):
  527. association_name = parameters[0]
  528. canvas_id = parameters[1]
  529. window_id = parameters[2]
  530. self.association_name = association_name
  531. self.canvas_id = canvas_id
  532. self.window_id = window_id
  533. def _root_creating_elevator_0_exec(self, parameters):
  534. canvas_id = parameters[0]
  535. rect_id = parameters[1]
  536. self.elevator_id = rect_id
  537. def _root_running_idle_0_exec(self, parameters):
  538. floor_number = parameters[0]
  539. if self.current_floor < floor_number:
  540. self.vel = -2
  541. else:
  542. self.vel = 2
  543. self.current_floor = floor_number
  544. height = (CANVAS_DIMS[1] - 150)
  545. y_dim = (height - ((FLOORS - 1) * FLOOR_SPACE)) / FLOORS
  546. self.next_pos['y'] = height - (y_dim /2) - (self.current_floor * (y_dim + FLOOR_SPACE));
  547. def _root_running_move_0_exec(self, parameters):
  548. self.big_step.outputEvent(Event("set_element_pos", self.getOutPortName("ui"), [self.canvas_id, self.elevator_id, self.pos['x'], self.pos['y']]))
  549. self.pos['y'] += self.vel
  550. def _root_running_move_1_exec(self, parameters):
  551. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("open_elevator", None, [])]))
  552. def _root_running_move_1_guard(self, parameters):
  553. return (self.vel > 0 and self.pos['y'] > self.next_pos['y']) or (self.vel < 0 and self.pos['y'] < self.next_pos['y'])
  554. def initializeStatechart(self):
  555. # enter default state
  556. self.default_targets = self.states["/root"].getEffectiveTargetStates()
  557. RuntimeClassBase.initializeStatechart(self)
  558. class Elevator(ObjectManagerBase):
  559. def __init__(self, name):
  560. ObjectManagerBase.__init__(self, name)
  561. self.input = self.addInPort("input")
  562. self.output = self.addOutPort("ui")
  563. self.outputs["floors"] = self.addOutPort("floors")
  564. self.outputs["parent"] = self.addOutPort("parent")
  565. self.elevator_ui = self.addInPort("elevator_ui")
  566. def constructObject(self, parameters):
  567. new_instance = ElevatorInstance(self, parameters[2])
  568. return new_instance
  569. class BallInstance(RuntimeClassBase):
  570. def __init__(self, atomdevs, canvas_id, floor_num, x, y, elevator_pos, elevator_dim):
  571. RuntimeClassBase.__init__(self, atomdevs)
  572. self.associations = {}
  573. self.associations["parent"] = Association("MainApp", 1, 1)
  574. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  575. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  576. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  577. self.semantics.priority = StatechartSemantics.SourceParent
  578. self.semantics.concurrency = StatechartSemantics.Single
  579. # build Statechart structure
  580. self.build_statechart_structure()
  581. # user defined attributes
  582. self.canvas_id = None
  583. self.pos = None
  584. # call user defined constructor
  585. BallInstance.user_defined_constructor(self, canvas_id, floor_num, x, y, elevator_pos, elevator_dim)
  586. port_name = Ports.addInputPort("<narrow_cast>", self)
  587. atomdevs.addInPort(port_name)
  588. port_name = Ports.addInputPort("ball_ui", self)
  589. atomdevs.addInPort(port_name)
  590. atomdevs.port_mappings[port_name] = atomdevs.next_instance
  591. self.inports["ball_ui"] = port_name
  592. def user_defined_constructor(self, canvas_id, floor_num, x, y, elevator_pos, elevator_dim):
  593. self.canvas_id = canvas_id;
  594. self.floor_num = floor_num;
  595. self.elevator_floor = 0;
  596. self.elevator_open = True;
  597. self.rect_pos = elevator_pos;
  598. self.rect_dim = elevator_dim;
  599. self.r = 5.0;
  600. self.vel = {'x': random.uniform(-5.0, 5.0), 'y': random.uniform(-5.0, 5.0)};
  601. self.pos = {'x': x, 'y': y};
  602. self.smooth = 0.6; # value between 0 and 1
  603. def user_defined_destructor(self):
  604. pass
  605. # builds Statechart structure
  606. def build_statechart_structure(self):
  607. # state <root>
  608. self.states[""] = State(0, "", self)
  609. # state /main_behaviour
  610. self.states["/main_behaviour"] = State(1, "/main_behaviour", self)
  611. # state /main_behaviour/initializing
  612. self.states["/main_behaviour/initializing"] = State(2, "/main_behaviour/initializing", self)
  613. # state /main_behaviour/creating_circle
  614. self.states["/main_behaviour/creating_circle"] = State(3, "/main_behaviour/creating_circle", self)
  615. self.states["/main_behaviour/creating_circle"].setEnter(self._main_behaviour_creating_circle_enter)
  616. # state /main_behaviour/bouncing
  617. self.states["/main_behaviour/bouncing"] = State(4, "/main_behaviour/bouncing", self)
  618. self.states["/main_behaviour/bouncing"].setEnter(self._main_behaviour_bouncing_enter)
  619. self.states["/main_behaviour/bouncing"].setExit(self._main_behaviour_bouncing_exit)
  620. # state /main_behaviour/ball_delete
  621. self.states["/main_behaviour/ball_delete"] = State(5, "/main_behaviour/ball_delete", self)
  622. # state /deleted
  623. self.states["/deleted"] = State(6, "/deleted", self)
  624. # add children
  625. self.states[""].addChild(self.states["/main_behaviour"])
  626. self.states[""].addChild(self.states["/deleted"])
  627. self.states["/main_behaviour"].addChild(self.states["/main_behaviour/initializing"])
  628. self.states["/main_behaviour"].addChild(self.states["/main_behaviour/creating_circle"])
  629. self.states["/main_behaviour"].addChild(self.states["/main_behaviour/bouncing"])
  630. self.states["/main_behaviour"].addChild(self.states["/main_behaviour/ball_delete"])
  631. self.states[""].fixTree()
  632. self.states[""].default_state = self.states["/main_behaviour"]
  633. self.states["/main_behaviour"].default_state = self.states["/main_behaviour/initializing"]
  634. # transition /main_behaviour/initializing
  635. _main_behaviour_initializing_0 = Transition(self, self.states["/main_behaviour/initializing"], [self.states["/main_behaviour/creating_circle"]])
  636. _main_behaviour_initializing_0.setAction(self._main_behaviour_initializing_0_exec)
  637. _main_behaviour_initializing_0.setTrigger(Event("set_association_name", None))
  638. self.states["/main_behaviour/initializing"].addTransition(_main_behaviour_initializing_0)
  639. # transition /main_behaviour/creating_circle
  640. _main_behaviour_creating_circle_0 = Transition(self, self.states["/main_behaviour/creating_circle"], [self.states["/main_behaviour/bouncing"]])
  641. _main_behaviour_creating_circle_0.setAction(self._main_behaviour_creating_circle_0_exec)
  642. _main_behaviour_creating_circle_0.setTrigger(Event("circle_created", None))
  643. self.states["/main_behaviour/creating_circle"].addTransition(_main_behaviour_creating_circle_0)
  644. # transition /main_behaviour/bouncing
  645. _main_behaviour_bouncing_0 = Transition(self, self.states["/main_behaviour/bouncing"], [self.states["/main_behaviour/bouncing"]])
  646. _main_behaviour_bouncing_0.setAction(self._main_behaviour_bouncing_0_exec)
  647. _main_behaviour_bouncing_0.setTrigger(Event("_0after"))
  648. self.states["/main_behaviour/bouncing"].addTransition(_main_behaviour_bouncing_0)
  649. _main_behaviour_bouncing_1 = Transition(self, self.states["/main_behaviour/bouncing"], [self.states["/main_behaviour/bouncing"]])
  650. _main_behaviour_bouncing_1.setAction(self._main_behaviour_bouncing_1_exec)
  651. _main_behaviour_bouncing_1.setTrigger(Event("open_elevator", None))
  652. self.states["/main_behaviour/bouncing"].addTransition(_main_behaviour_bouncing_1)
  653. _main_behaviour_bouncing_2 = Transition(self, self.states["/main_behaviour/bouncing"], [self.states["/main_behaviour/ball_delete"]])
  654. _main_behaviour_bouncing_2.setTrigger(None)
  655. _main_behaviour_bouncing_2.setGuard(self._main_behaviour_bouncing_2_guard)
  656. self.states["/main_behaviour/bouncing"].addTransition(_main_behaviour_bouncing_2)
  657. _main_behaviour_bouncing_3 = Transition(self, self.states["/main_behaviour/bouncing"], [self.states["/main_behaviour/bouncing"]])
  658. _main_behaviour_bouncing_3.setAction(self._main_behaviour_bouncing_3_exec)
  659. _main_behaviour_bouncing_3.setTrigger(Event("update_elevator_bounds", None))
  660. self.states["/main_behaviour/bouncing"].addTransition(_main_behaviour_bouncing_3)
  661. # transition /main_behaviour/ball_delete
  662. _main_behaviour_ball_delete_0 = Transition(self, self.states["/main_behaviour/ball_delete"], [self.states["/deleted"]])
  663. _main_behaviour_ball_delete_0.setAction(self._main_behaviour_ball_delete_0_exec)
  664. _main_behaviour_ball_delete_0.setTrigger(Event("delete_self", None))
  665. self.states["/main_behaviour/ball_delete"].addTransition(_main_behaviour_ball_delete_0)
  666. def _main_behaviour_creating_circle_enter(self):
  667. 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']]))
  668. def _main_behaviour_bouncing_enter(self):
  669. self.addTimer(0, 0.02)
  670. def _main_behaviour_bouncing_exit(self):
  671. self.removeTimer(0)
  672. def _main_behaviour_initializing_0_exec(self, parameters):
  673. association_name = parameters[0]
  674. self.association_name = association_name
  675. def _main_behaviour_creating_circle_0_exec(self, parameters):
  676. canvas_id = parameters[0]
  677. circle_id = parameters[1]
  678. self.circle_id = circle_id
  679. def _main_behaviour_bouncing_0_exec(self, parameters):
  680. if self.floor_num == -1:
  681. if self.pos['x'] - self.r < self.rect_pos['x'] - (self.rect_dim['x'] / 2):
  682. if self.elevator_open:
  683. self.floor_num = self.elevator_floor
  684. else:
  685. self.pos['x'] = self.rect_pos['x'] - (self.rect_dim['x'] / 2) + self.r
  686. self.vel['x'] = -self.vel['x']
  687. elif self.pos['x'] + self.r > self.rect_pos['x'] + (self.rect_dim['x'] / 2):
  688. self.pos['x'] = self.rect_pos['x'] + (self.rect_dim['x'] / 2) - self.r
  689. self.vel['x'] = -self.vel['x']
  690. # Check collision with the top and bottom borders
  691. if self.pos['y'] - self.r < self.rect_pos['y'] - (self.rect_dim['y'] / 2):
  692. self.pos['y'] = self.rect_pos['y'] - (self.rect_dim['y'] / 2) + self.r
  693. self.vel['y'] = -self.vel['y'] + self.rect_vel
  694. elif self.pos['y'] + self.r > self.rect_pos['y'] + (self.rect_dim['y'] / 2):
  695. self.pos['y'] = self.rect_pos['y'] + (self.rect_dim['y'] / 2) - self.r
  696. self.vel['y'] = -self.vel['y'] + self.rect_vel
  697. else:
  698. floor_height = ((CANVAS_DIMS[1] - 150) - ((FLOORS - 1) * FLOOR_SPACE)) / FLOORS
  699. floor_dim = {'x': FLOOR_LENGTH, 'y': floor_height};
  700. floor_pos = {'x': FLOOR_LENGTH / 2, 'y': (CANVAS_DIMS[1] - 150) - (floor_height /2) - ( self.floor_num * (floor_height + FLOOR_SPACE) )};
  701. if self.pos['x'] - self.r < floor_pos['x'] - (floor_dim['x'] / 2):
  702. self.pos['x'] = floor_pos['x'] - (floor_dim['x'] / 2) + self.r
  703. self.vel['x'] = -self.vel['x']
  704. elif self.pos['x'] + self.r > floor_pos['x'] + (floor_dim['x'] / 2):
  705. if self.elevator_open and (self.elevator_floor == self.floor_num):
  706. self.floor_num = -1
  707. else:
  708. self.pos['x'] = floor_pos['x'] + (floor_dim['x'] / 2) - self.r
  709. self.vel['x'] = -self.vel['x']
  710. # Check collision with the top and bottom borders
  711. if self.pos['y'] - self.r < floor_pos['y'] - (floor_dim['y'] / 2):
  712. self.pos['y'] = floor_pos['y'] - (floor_dim['y'] / 2) + self.r
  713. self.vel['y'] = -self.vel['y']
  714. elif self.pos['y'] + self.r > floor_pos['y'] + (floor_dim['y'] / 2):
  715. self.pos['y'] = floor_pos['y'] + (floor_dim['y'] / 2) - self.r # Correct position
  716. self.vel['y'] = -self.vel['y']
  717. self.big_step.outputEvent(Event("move_element", self.getOutPortName("ui"), [self.canvas_id, self.circle_id, self.vel['x'], self.vel['y']]))
  718. self.pos['x'] += self.vel['x']
  719. self.pos['y'] += self.vel['y']
  720. def _main_behaviour_bouncing_1_exec(self, parameters):
  721. self.elevator_open = True
  722. def _main_behaviour_bouncing_2_guard(self, parameters):
  723. return self.pos['x'] - self.r < 2
  724. def _main_behaviour_bouncing_3_exec(self, parameters):
  725. pos = parameters[0]
  726. dim = parameters[1]
  727. vel = parameters[2]
  728. self.rect_pos = pos
  729. self.rect_dim = dim
  730. self.rect_vel = vel
  731. self.elevator_open = False
  732. def _main_behaviour_ball_delete_0_exec(self, parameters):
  733. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'floor', Event("delete_ball", None, [self.association_name])]))
  734. self.big_step.outputEvent(Event("destroy_element", self.getOutPortName("ui"), [self.canvas_id, self.circle_id]))
  735. def initializeStatechart(self):
  736. # enter default state
  737. self.default_targets = self.states["/main_behaviour"].getEffectiveTargetStates()
  738. RuntimeClassBase.initializeStatechart(self)
  739. class Ball(ObjectManagerBase):
  740. def __init__(self, name):
  741. ObjectManagerBase.__init__(self, name)
  742. self.input = self.addInPort("input")
  743. self.output = self.addOutPort("ui")
  744. self.outputs["parent"] = self.addOutPort("parent")
  745. self.ball_ui = self.addInPort("ball_ui")
  746. def constructObject(self, parameters):
  747. new_instance = BallInstance(self, parameters[2], parameters[3], parameters[4], parameters[5], parameters[6], parameters[7])
  748. return new_instance
  749. class ObjectManagerState:
  750. def __init__(self):
  751. self.to_send = [("MainApp", "MainApp", Event("start_instance", None, ["MainApp[0]"], 0))]
  752. class ObjectManager(TheObjectManager):
  753. def __init__(self, name):
  754. TheObjectManager.__init__(self, name)
  755. self.State = ObjectManagerState()
  756. self.input = self.addInPort("input")
  757. self.output["MainApp"] = self.addOutPort()
  758. self.output["Floor"] = self.addOutPort()
  759. self.output["ElevatorButton"] = self.addOutPort()
  760. self.output["Elevator"] = self.addOutPort()
  761. self.output["Ball"] = self.addOutPort()
  762. class Controller(CoupledDEVS):
  763. def __init__(self, name):
  764. CoupledDEVS.__init__(self, name)
  765. self.in_ui = self.addInPort("ui")
  766. Ports.addInputPort("ui")
  767. self.out_ui = self.addOutPort("ui")
  768. Ports.addOutputPort("ui")
  769. self.objectmanager = self.addSubModel(ObjectManager("ObjectManager"))
  770. self.atomic0 = self.addSubModel(MainApp("MainApp"))
  771. self.atomic1 = self.addSubModel(Floor("Floor"))
  772. self.atomic2 = self.addSubModel(ElevatorButton("ElevatorButton"))
  773. self.atomic3 = self.addSubModel(Elevator("Elevator"))
  774. self.atomic4 = self.addSubModel(Ball("Ball"))
  775. self.connectPorts(self.atomic0.obj_manager_out, self.objectmanager.input)
  776. self.connectPorts(self.objectmanager.output["MainApp"], self.atomic0.obj_manager_in)
  777. self.connectPorts(self.atomic0.outputs["floor"], self.atomic1.input)
  778. self.connectPorts(self.atomic0.outputs["button"], self.atomic2.input)
  779. self.connectPorts(self.atomic0.outputs["elevator"], self.atomic3.input)
  780. self.connectPorts(self.atomic0.outputs["ball"], self.atomic4.input)
  781. self.connectPorts(self.atomic1.obj_manager_out, self.objectmanager.input)
  782. self.connectPorts(self.objectmanager.output["Floor"], self.atomic1.obj_manager_in)
  783. self.connectPorts(self.atomic1.outputs["parent"], self.atomic0.input)
  784. self.connectPorts(self.atomic2.obj_manager_out, self.objectmanager.input)
  785. self.connectPorts(self.objectmanager.output["ElevatorButton"], self.atomic2.obj_manager_in)
  786. self.connectPorts(self.atomic2.outputs["parent"], self.atomic0.input)
  787. self.connectPorts(self.atomic3.obj_manager_out, self.objectmanager.input)
  788. self.connectPorts(self.objectmanager.output["Elevator"], self.atomic3.obj_manager_in)
  789. self.connectPorts(self.atomic3.outputs["floors"], self.atomic1.input)
  790. self.connectPorts(self.atomic3.outputs["parent"], self.atomic0.input)
  791. self.connectPorts(self.atomic4.obj_manager_out, self.objectmanager.input)
  792. self.connectPorts(self.objectmanager.output["Ball"], self.atomic4.obj_manager_in)
  793. self.connectPorts(self.atomic4.outputs["parent"], self.atomic0.input)
  794. self.connectPorts(self.atomic0.output, self.out_ui)
  795. self.connectPorts(self.atomic1.output, self.out_ui)
  796. self.connectPorts(self.atomic2.output, self.out_ui)
  797. self.connectPorts(self.atomic3.output, self.out_ui)
  798. self.connectPorts(self.atomic4.output, self.out_ui)