player_controller.py 27 KB

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