player_controller.py 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512
  1. """
  2. Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
  3. Date: Thu Aug 04 13:29:23 2016
  4. Model author: Glenn De Jonghe
  5. Model name: Player Tank
  6. Model description:
  7. Handling the player tank.
  8. """
  9. from sccd.runtime.statecharts_core import *
  10. # package "Player Tank"
  11. class Main(RuntimeClassBase):
  12. def __init__(self, controller, tank):
  13. RuntimeClassBase.__init__(self, controller)
  14. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  15. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  16. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  17. self.semantics.priority = StatechartSemantics.SourceParent
  18. self.semantics.concurrency = StatechartSemantics.Single
  19. # build Statechart structure
  20. self.build_statechart_structure()
  21. # user defined attributes
  22. self.tank = None
  23. # call user defined constructor
  24. Main.user_defined_constructor(self, tank)
  25. def user_defined_constructor(self, tank):
  26. self.tank = tank
  27. def user_defined_destructor(self):
  28. pass
  29. # builds Statechart structure
  30. def build_statechart_structure(self):
  31. # state <root>
  32. self.states[""] = State(0, self)
  33. # state /state_1
  34. self.states["/state_1"] = State(1, self)
  35. # state /state_2
  36. self.states["/state_2"] = State(2, self)
  37. # state /state_3
  38. self.states["/state_3"] = State(3, self)
  39. # state /state_4
  40. self.states["/state_4"] = State(4, self)
  41. # state /end
  42. self.states["/end"] = State(5, self)
  43. # add children
  44. self.states[""].addChild(self.states["/state_1"])
  45. self.states[""].addChild(self.states["/state_2"])
  46. self.states[""].addChild(self.states["/state_3"])
  47. self.states[""].addChild(self.states["/state_4"])
  48. self.states[""].addChild(self.states["/end"])
  49. self.states[""].fixTree()
  50. self.states[""].default_state = self.states["/state_1"]
  51. # transition /state_1
  52. _state_1_0 = Transition(self, self.states["/state_1"], [self.states["/state_2"]])
  53. _state_1_0.setAction(self._state_1_0_exec)
  54. self.states["/state_1"].addTransition(_state_1_0)
  55. # transition /state_2
  56. _state_2_0 = Transition(self, self.states["/state_2"], [self.states["/state_3"]])
  57. _state_2_0.trigger = Event("instance_created", None)
  58. self.states["/state_2"].addTransition(_state_2_0)
  59. # transition /state_3
  60. _state_3_0 = Transition(self, self.states["/state_3"], [self.states["/state_4"]])
  61. _state_3_0.setAction(self._state_3_0_exec)
  62. self.states["/state_3"].addTransition(_state_3_0)
  63. # transition /state_4
  64. _state_4_0 = Transition(self, self.states["/state_4"], [self.states["/end"]])
  65. _state_4_0.setAction(self._state_4_0_exec)
  66. _state_4_0.trigger = Event("instance_created", None)
  67. self.states["/state_4"].addTransition(_state_4_0)
  68. def _state_1_0_exec(self, parameters):
  69. self.big_step.outputEventOM(Event("create_instance", None, [self, 'cannon', 'Cannon', self.tank]))
  70. def _state_3_0_exec(self, parameters):
  71. self.big_step.outputEventOM(Event("create_instance", None, [self, 'body', 'Body', self.tank]))
  72. def _state_4_0_exec(self, parameters):
  73. self.big_step.outputEventOM(Event("start_instance", None, [self, 'cannon']))
  74. self.big_step.outputEventOM(Event("start_instance", None, [self, 'body']))
  75. def initializeStatechart(self):
  76. # enter default state
  77. states = self.states["/state_1"].getEffectiveTargetStates()
  78. self.updateConfiguration(states)
  79. for state in states:
  80. if state.enter:
  81. state.enter()
  82. class Cannon(RuntimeClassBase):
  83. def __init__(self, controller, tank):
  84. RuntimeClassBase.__init__(self, controller)
  85. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  86. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  87. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  88. self.semantics.priority = StatechartSemantics.SourceParent
  89. self.semantics.concurrency = StatechartSemantics.Single
  90. # build Statechart structure
  91. self.build_statechart_structure()
  92. # user defined attributes
  93. self.tank = None
  94. self.reload_time = None
  95. # call user defined constructor
  96. Cannon.user_defined_constructor(self, tank)
  97. def user_defined_constructor(self, tank):
  98. self.tank = tank
  99. self.reload_time = tank.getReloadTime()
  100. def user_defined_destructor(self):
  101. pass
  102. # builds Statechart structure
  103. def build_statechart_structure(self):
  104. # state <root>
  105. self.states[""] = State(0, self)
  106. # state /container
  107. self.states["/container"] = ParallelState(1, self)
  108. # state /container/rotating
  109. self.states["/container/rotating"] = State(2, self)
  110. # state /container/rotating/none
  111. self.states["/container/rotating/none"] = State(3, self)
  112. # state /container/rotating/left
  113. self.states["/container/rotating/left"] = State(4, self)
  114. # state /container/rotating/both
  115. self.states["/container/rotating/both"] = State(5, self)
  116. # state /container/rotating/right
  117. self.states["/container/rotating/right"] = State(6, self)
  118. # state /container/shoot
  119. self.states["/container/shoot"] = State(7, self)
  120. # state /container/shoot/hold
  121. self.states["/container/shoot/hold"] = State(8, self)
  122. # state /container/shoot/shoot
  123. self.states["/container/shoot/shoot"] = State(9, self)
  124. # state /container/ammo
  125. self.states["/container/ammo"] = State(10, self)
  126. # state /container/ammo/loaded
  127. self.states["/container/ammo/loaded"] = State(11, self)
  128. # state /container/ammo/unloaded
  129. self.states["/container/ammo/unloaded"] = State(12, self)
  130. self.states["/container/ammo/unloaded"].setEnter(self._container_ammo_unloaded_enter)
  131. self.states["/container/ammo/unloaded"].setExit(self._container_ammo_unloaded_exit)
  132. # add children
  133. self.states[""].addChild(self.states["/container"])
  134. self.states["/container"].addChild(self.states["/container/rotating"])
  135. self.states["/container"].addChild(self.states["/container/shoot"])
  136. self.states["/container"].addChild(self.states["/container/ammo"])
  137. self.states["/container/rotating"].addChild(self.states["/container/rotating/none"])
  138. self.states["/container/rotating"].addChild(self.states["/container/rotating/left"])
  139. self.states["/container/rotating"].addChild(self.states["/container/rotating/both"])
  140. self.states["/container/rotating"].addChild(self.states["/container/rotating/right"])
  141. self.states["/container/shoot"].addChild(self.states["/container/shoot/hold"])
  142. self.states["/container/shoot"].addChild(self.states["/container/shoot/shoot"])
  143. self.states["/container/ammo"].addChild(self.states["/container/ammo/loaded"])
  144. self.states["/container/ammo"].addChild(self.states["/container/ammo/unloaded"])
  145. self.states[""].fixTree()
  146. self.states[""].default_state = self.states["/container"]
  147. self.states["/container/rotating"].default_state = self.states["/container/rotating/none"]
  148. self.states["/container/shoot"].default_state = self.states["/container/shoot/hold"]
  149. self.states["/container/ammo"].default_state = self.states["/container/ammo/loaded"]
  150. # transition /container/rotating/none
  151. _container_rotating_none_0 = Transition(self, self.states["/container/rotating/none"], [self.states["/container/rotating/left"]])
  152. _container_rotating_none_0.trigger = Event("cannon-left-pressed", "input")
  153. self.states["/container/rotating/none"].addTransition(_container_rotating_none_0)
  154. _container_rotating_none_1 = Transition(self, self.states["/container/rotating/none"], [self.states["/container/rotating/right"]])
  155. _container_rotating_none_1.trigger = Event("cannon-right-pressed", "input")
  156. self.states["/container/rotating/none"].addTransition(_container_rotating_none_1)
  157. # transition /container/rotating/left
  158. _container_rotating_left_0 = Transition(self, self.states["/container/rotating/left"], [self.states["/container/rotating/none"]])
  159. _container_rotating_left_0.trigger = Event("cannon-left-released", "input")
  160. self.states["/container/rotating/left"].addTransition(_container_rotating_left_0)
  161. _container_rotating_left_1 = Transition(self, self.states["/container/rotating/left"], [self.states["/container/rotating/both"]])
  162. _container_rotating_left_1.trigger = Event("cannon-right-pressed", "input")
  163. self.states["/container/rotating/left"].addTransition(_container_rotating_left_1)
  164. _container_rotating_left_2 = Transition(self, self.states["/container/rotating/left"], [self.states["/container/rotating/left"]])
  165. _container_rotating_left_2.setAction(self._container_rotating_left_2_exec)
  166. _container_rotating_left_2.trigger = Event("update", "engine")
  167. self.states["/container/rotating/left"].addTransition(_container_rotating_left_2)
  168. # transition /container/rotating/both
  169. _container_rotating_both_0 = Transition(self, self.states["/container/rotating/both"], [self.states["/container/rotating/right"]])
  170. _container_rotating_both_0.trigger = Event("cannon-left-released", "input")
  171. self.states["/container/rotating/both"].addTransition(_container_rotating_both_0)
  172. _container_rotating_both_1 = Transition(self, self.states["/container/rotating/both"], [self.states["/container/rotating/left"]])
  173. _container_rotating_both_1.trigger = Event("cannon-right-released", "input")
  174. self.states["/container/rotating/both"].addTransition(_container_rotating_both_1)
  175. # transition /container/rotating/right
  176. _container_rotating_right_0 = Transition(self, self.states["/container/rotating/right"], [self.states["/container/rotating/both"]])
  177. _container_rotating_right_0.trigger = Event("cannon-left-pressed", "input")
  178. self.states["/container/rotating/right"].addTransition(_container_rotating_right_0)
  179. _container_rotating_right_1 = Transition(self, self.states["/container/rotating/right"], [self.states["/container/rotating/none"]])
  180. _container_rotating_right_1.trigger = Event("cannon-right-released", "input")
  181. self.states["/container/rotating/right"].addTransition(_container_rotating_right_1)
  182. _container_rotating_right_2 = Transition(self, self.states["/container/rotating/right"], [self.states["/container/rotating/right"]])
  183. _container_rotating_right_2.setAction(self._container_rotating_right_2_exec)
  184. _container_rotating_right_2.trigger = Event("update", "engine")
  185. self.states["/container/rotating/right"].addTransition(_container_rotating_right_2)
  186. # transition /container/shoot/hold
  187. _container_shoot_hold_0 = Transition(self, self.states["/container/shoot/hold"], [self.states["/container/shoot/shoot"]])
  188. _container_shoot_hold_0.setAction(self._container_shoot_hold_0_exec)
  189. _container_shoot_hold_0.trigger = Event("shoot-pressed", "input")
  190. self.states["/container/shoot/hold"].addTransition(_container_shoot_hold_0)
  191. # transition /container/shoot/shoot
  192. _container_shoot_shoot_0 = Transition(self, self.states["/container/shoot/shoot"], [self.states["/container/shoot/hold"]])
  193. _container_shoot_shoot_0.trigger = Event("shoot-released", "input")
  194. self.states["/container/shoot/shoot"].addTransition(_container_shoot_shoot_0)
  195. _container_shoot_shoot_1 = Transition(self, self.states["/container/shoot/shoot"], [self.states["/container/shoot/shoot"]])
  196. _container_shoot_shoot_1.setAction(self._container_shoot_shoot_1_exec)
  197. _container_shoot_shoot_1.trigger = Event("loaded", None)
  198. self.states["/container/shoot/shoot"].addTransition(_container_shoot_shoot_1)
  199. # transition /container/ammo/loaded
  200. _container_ammo_loaded_0 = Transition(self, self.states["/container/ammo/loaded"], [self.states["/container/ammo/unloaded"]])
  201. _container_ammo_loaded_0.setAction(self._container_ammo_loaded_0_exec)
  202. _container_ammo_loaded_0.trigger = Event("shoot", None)
  203. self.states["/container/ammo/loaded"].addTransition(_container_ammo_loaded_0)
  204. # transition /container/ammo/unloaded
  205. _container_ammo_unloaded_0 = Transition(self, self.states["/container/ammo/unloaded"], [self.states["/container/ammo/loaded"]])
  206. _container_ammo_unloaded_0.setAction(self._container_ammo_unloaded_0_exec)
  207. _container_ammo_unloaded_0.trigger = Event("_0after")
  208. self.states["/container/ammo/unloaded"].addTransition(_container_ammo_unloaded_0)
  209. def _container_ammo_unloaded_enter(self):
  210. self.addTimer(0, self.reload_time)
  211. def _container_ammo_unloaded_exit(self):
  212. self.removeTimer(0)
  213. def _container_rotating_left_2_exec(self, parameters):
  214. self.tank.turnCannonLeft()
  215. def _container_rotating_right_2_exec(self, parameters):
  216. self.tank.turnCannonRight()
  217. def _container_shoot_hold_0_exec(self, parameters):
  218. self.raiseInternalEvent(Event("shoot", None, []))
  219. def _container_shoot_shoot_1_exec(self, parameters):
  220. self.raiseInternalEvent(Event("shoot", None, []))
  221. def _container_ammo_loaded_0_exec(self, parameters):
  222. self.tank.shoot()
  223. self.big_step.outputEvent(Event("reloading", "gui", []))
  224. def _container_ammo_unloaded_0_exec(self, parameters):
  225. self.raiseInternalEvent(Event("loaded", None, []))
  226. self.big_step.outputEvent(Event("loaded", "gui", []))
  227. def initializeStatechart(self):
  228. # enter default state
  229. states = self.states["/container"].getEffectiveTargetStates()
  230. self.updateConfiguration(states)
  231. for state in states:
  232. if state.enter:
  233. state.enter()
  234. class Body(RuntimeClassBase):
  235. def __init__(self, controller, tank):
  236. RuntimeClassBase.__init__(self, controller)
  237. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  238. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  239. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  240. self.semantics.priority = StatechartSemantics.SourceParent
  241. self.semantics.concurrency = StatechartSemantics.Single
  242. # build Statechart structure
  243. self.build_statechart_structure()
  244. # user defined attributes
  245. self.tank = None
  246. # call user defined constructor
  247. Body.user_defined_constructor(self, tank)
  248. def user_defined_constructor(self, tank):
  249. self.tank = tank
  250. def user_defined_destructor(self):
  251. pass
  252. # builds Statechart structure
  253. def build_statechart_structure(self):
  254. # state <root>
  255. self.states[""] = State(0, self)
  256. # state /container
  257. self.states["/container"] = ParallelState(1, self)
  258. # state /container/horizontal
  259. self.states["/container/horizontal"] = State(2, self)
  260. # state /container/horizontal/none
  261. self.states["/container/horizontal/none"] = State(3, self)
  262. # state /container/horizontal/left
  263. self.states["/container/horizontal/left"] = State(4, self)
  264. # state /container/horizontal/both
  265. self.states["/container/horizontal/both"] = State(5, self)
  266. # state /container/horizontal/right
  267. self.states["/container/horizontal/right"] = State(6, self)
  268. # state /container/vertical
  269. self.states["/container/vertical"] = State(7, self)
  270. # state /container/vertical/none
  271. self.states["/container/vertical/none"] = State(8, self)
  272. # state /container/vertical/down
  273. self.states["/container/vertical/down"] = State(9, self)
  274. # state /container/vertical/both
  275. self.states["/container/vertical/both"] = State(10, self)
  276. # state /container/vertical/up
  277. self.states["/container/vertical/up"] = State(11, self)
  278. # add children
  279. self.states[""].addChild(self.states["/container"])
  280. self.states["/container"].addChild(self.states["/container/horizontal"])
  281. self.states["/container"].addChild(self.states["/container/vertical"])
  282. self.states["/container/horizontal"].addChild(self.states["/container/horizontal/none"])
  283. self.states["/container/horizontal"].addChild(self.states["/container/horizontal/left"])
  284. self.states["/container/horizontal"].addChild(self.states["/container/horizontal/both"])
  285. self.states["/container/horizontal"].addChild(self.states["/container/horizontal/right"])
  286. self.states["/container/vertical"].addChild(self.states["/container/vertical/none"])
  287. self.states["/container/vertical"].addChild(self.states["/container/vertical/down"])
  288. self.states["/container/vertical"].addChild(self.states["/container/vertical/both"])
  289. self.states["/container/vertical"].addChild(self.states["/container/vertical/up"])
  290. self.states[""].fixTree()
  291. self.states[""].default_state = self.states["/container"]
  292. self.states["/container/horizontal"].default_state = self.states["/container/horizontal/none"]
  293. self.states["/container/vertical"].default_state = self.states["/container/vertical/none"]
  294. # transition /container/horizontal/none
  295. _container_horizontal_none_0 = Transition(self, self.states["/container/horizontal/none"], [self.states["/container/horizontal/left"]])
  296. _container_horizontal_none_0.trigger = Event("left-pressed", "input")
  297. self.states["/container/horizontal/none"].addTransition(_container_horizontal_none_0)
  298. _container_horizontal_none_1 = Transition(self, self.states["/container/horizontal/none"], [self.states["/container/horizontal/right"]])
  299. _container_horizontal_none_1.trigger = Event("right-pressed", "input")
  300. self.states["/container/horizontal/none"].addTransition(_container_horizontal_none_1)
  301. # transition /container/horizontal/left
  302. _container_horizontal_left_0 = Transition(self, self.states["/container/horizontal/left"], [self.states["/container/horizontal/none"]])
  303. _container_horizontal_left_0.trigger = Event("left-released", "input")
  304. self.states["/container/horizontal/left"].addTransition(_container_horizontal_left_0)
  305. _container_horizontal_left_1 = Transition(self, self.states["/container/horizontal/left"], [self.states["/container/horizontal/both"]])
  306. _container_horizontal_left_1.trigger = Event("right-pressed", "input")
  307. self.states["/container/horizontal/left"].addTransition(_container_horizontal_left_1)
  308. _container_horizontal_left_2 = Transition(self, self.states["/container/horizontal/left"], [self.states["/container/horizontal/left"]])
  309. _container_horizontal_left_2.setAction(self._container_horizontal_left_2_exec)
  310. _container_horizontal_left_2.trigger = Event("update", "engine")
  311. self.states["/container/horizontal/left"].addTransition(_container_horizontal_left_2)
  312. # transition /container/horizontal/both
  313. _container_horizontal_both_0 = Transition(self, self.states["/container/horizontal/both"], [self.states["/container/horizontal/right"]])
  314. _container_horizontal_both_0.trigger = Event("left-released", "input")
  315. self.states["/container/horizontal/both"].addTransition(_container_horizontal_both_0)
  316. _container_horizontal_both_1 = Transition(self, self.states["/container/horizontal/both"], [self.states["/container/horizontal/left"]])
  317. _container_horizontal_both_1.trigger = Event("right-released", "input")
  318. self.states["/container/horizontal/both"].addTransition(_container_horizontal_both_1)
  319. # transition /container/horizontal/right
  320. _container_horizontal_right_0 = Transition(self, self.states["/container/horizontal/right"], [self.states["/container/horizontal/both"]])
  321. _container_horizontal_right_0.trigger = Event("left-pressed", "input")
  322. self.states["/container/horizontal/right"].addTransition(_container_horizontal_right_0)
  323. _container_horizontal_right_1 = Transition(self, self.states["/container/horizontal/right"], [self.states["/container/horizontal/none"]])
  324. _container_horizontal_right_1.trigger = Event("right-released", "input")
  325. self.states["/container/horizontal/right"].addTransition(_container_horizontal_right_1)
  326. _container_horizontal_right_2 = Transition(self, self.states["/container/horizontal/right"], [self.states["/container/horizontal/right"]])
  327. _container_horizontal_right_2.setAction(self._container_horizontal_right_2_exec)
  328. _container_horizontal_right_2.trigger = Event("update", "engine")
  329. self.states["/container/horizontal/right"].addTransition(_container_horizontal_right_2)
  330. # transition /container/vertical/none
  331. _container_vertical_none_0 = Transition(self, self.states["/container/vertical/none"], [self.states["/container/vertical/down"]])
  332. _container_vertical_none_0.trigger = Event("down-pressed", "input")
  333. self.states["/container/vertical/none"].addTransition(_container_vertical_none_0)
  334. _container_vertical_none_1 = Transition(self, self.states["/container/vertical/none"], [self.states["/container/vertical/up"]])
  335. _container_vertical_none_1.trigger = Event("up-pressed", "input")
  336. self.states["/container/vertical/none"].addTransition(_container_vertical_none_1)
  337. # transition /container/vertical/down
  338. _container_vertical_down_0 = Transition(self, self.states["/container/vertical/down"], [self.states["/container/vertical/none"]])
  339. _container_vertical_down_0.trigger = Event("down-released", "input")
  340. self.states["/container/vertical/down"].addTransition(_container_vertical_down_0)
  341. _container_vertical_down_1 = Transition(self, self.states["/container/vertical/down"], [self.states["/container/vertical/both"]])
  342. _container_vertical_down_1.trigger = Event("up-pressed", "input")
  343. self.states["/container/vertical/down"].addTransition(_container_vertical_down_1)
  344. _container_vertical_down_2 = Transition(self, self.states["/container/vertical/down"], [self.states["/container/vertical/down"]])
  345. _container_vertical_down_2.setAction(self._container_vertical_down_2_exec)
  346. _container_vertical_down_2.trigger = Event("update", "engine")
  347. self.states["/container/vertical/down"].addTransition(_container_vertical_down_2)
  348. # transition /container/vertical/both
  349. _container_vertical_both_0 = Transition(self, self.states["/container/vertical/both"], [self.states["/container/vertical/up"]])
  350. _container_vertical_both_0.trigger = Event("down-released", "input")
  351. self.states["/container/vertical/both"].addTransition(_container_vertical_both_0)
  352. _container_vertical_both_1 = Transition(self, self.states["/container/vertical/both"], [self.states["/container/vertical/down"]])
  353. _container_vertical_both_1.trigger = Event("up-released", "input")
  354. self.states["/container/vertical/both"].addTransition(_container_vertical_both_1)
  355. # transition /container/vertical/up
  356. _container_vertical_up_0 = Transition(self, self.states["/container/vertical/up"], [self.states["/container/vertical/both"]])
  357. _container_vertical_up_0.trigger = Event("down-pressed", "input")
  358. self.states["/container/vertical/up"].addTransition(_container_vertical_up_0)
  359. _container_vertical_up_1 = Transition(self, self.states["/container/vertical/up"], [self.states["/container/vertical/none"]])
  360. _container_vertical_up_1.trigger = Event("up-released", "input")
  361. self.states["/container/vertical/up"].addTransition(_container_vertical_up_1)
  362. _container_vertical_up_2 = Transition(self, self.states["/container/vertical/up"], [self.states["/container/vertical/up"]])
  363. _container_vertical_up_2.setAction(self._container_vertical_up_2_exec)
  364. _container_vertical_up_2.trigger = Event("update", "engine")
  365. self.states["/container/vertical/up"].addTransition(_container_vertical_up_2)
  366. def _container_horizontal_left_2_exec(self, parameters):
  367. self.tank.turnLeft()
  368. def _container_horizontal_right_2_exec(self, parameters):
  369. self.tank.turnRight()
  370. def _container_vertical_down_2_exec(self, parameters):
  371. self.tank.moveDown()
  372. def _container_vertical_up_2_exec(self, parameters):
  373. self.tank.moveUp()
  374. def initializeStatechart(self):
  375. # enter default state
  376. states = self.states["/container"].getEffectiveTargetStates()
  377. self.updateConfiguration(states)
  378. for state in states:
  379. if state.enter:
  380. state.enter()
  381. class ObjectManager(ObjectManagerBase):
  382. def __init__(self, controller):
  383. ObjectManagerBase.__init__(self, controller)
  384. def instantiate(self, class_name, construct_params):
  385. if class_name == "Main":
  386. instance = Main(self.controller, construct_params[0])
  387. instance.associations = {}
  388. instance.associations["cannon"] = Association("Cannon", 1, 1)
  389. instance.associations["body"] = Association("Body", 1, 1)
  390. elif class_name == "Cannon":
  391. instance = Cannon(self.controller, construct_params[0])
  392. instance.associations = {}
  393. elif class_name == "Body":
  394. instance = Body(self.controller, construct_params[0])
  395. instance.associations = {}
  396. else:
  397. raise Exception("Cannot instantiate class " + class_name)
  398. return instance
  399. class Controller(EventLoopControllerBase):
  400. def __init__(self, tank, event_loop_callbacks, finished_callback = None):
  401. if finished_callback == None: finished_callback = None
  402. EventLoopControllerBase.__init__(self, ObjectManager(self), event_loop_callbacks, finished_callback)
  403. self.addInputPort("engine")
  404. self.addInputPort("input")
  405. self.addOutputPort("gui")
  406. self.object_manager.createInstance("Main", [tank])