player_controller.py 27 KB

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