traffic.py 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552
  1. """
  2. Generated by Statechart compiler by Glenn De Jonghe and Joeri Exelmans
  3. Date: Sun Dec 07 18:22:48 2014
  4. Model author: Raphael Mannadiar
  5. Model name: Traffic_Light
  6. Model description:
  7. PIM Traffic lights.
  8. """
  9. from python_runtime.statecharts_core import *
  10. from python_runtime.libs.ui import *
  11. from python_runtime.libs.utils import *
  12. # package "Traffic_Light"
  13. class TrafficLight(RuntimeClassBase):
  14. def __init__(self, controller, canvas):
  15. RuntimeClassBase.__init__(self, controller)
  16. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  17. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  18. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  19. self.semantics.priority = StatechartSemantics.SourceParent
  20. self.semantics.concurrency = StatechartSemantics.Single
  21. # Call user defined constructor
  22. TrafficLight.user_defined_constructor(self, canvas)
  23. def user_defined_constructor(self, canvas):
  24. size = 100
  25. offset = size + 5
  26. self.RED = 0
  27. self.YELLOW = 1
  28. self.GREEN = 2
  29. self.colors = ['#f00', '#ff0', '#0f0']
  30. self.lights = [canvas.add_rectangle(size / 2, size / 2, size, size, {'fill':'#000'}), canvas.add_rectangle(size / 2, size / 2 + offset, size, size, {'fill':'#000'}), canvas.add_rectangle(size / 2, size / 2 + 2 * offset, size, size, {'fill':'#000'})]
  31. def user_defined_destructor(self):
  32. pass
  33. # User defined method
  34. def setYellow(self):
  35. self.clear()
  36. self.lights[self.YELLOW].set_color(self.colors[self.YELLOW])
  37. # User defined method
  38. def setGreen(self):
  39. self.clear()
  40. self.lights[self.GREEN].set_color(self.colors[self.GREEN])
  41. # User defined method
  42. def clear(self):
  43. self.lights[self.RED].set_color('#000')
  44. self.lights[self.YELLOW].set_color('#000')
  45. self.lights[self.GREEN].set_color('#000')
  46. # User defined method
  47. def setRed(self):
  48. self.clear()
  49. self.lights[self.RED].set_color(self.colors[self.RED])
  50. def initializeStatechart(self):
  51. self.current_state[self.Root] = []
  52. self.current_state[self.Root_on] = []
  53. self.current_state[self.Root_on_interrupted] = []
  54. self.current_state[self.Root_on_normal] = []
  55. self.history_state[self.Root_on_normal] = []
  56. # Enter default state
  57. self.enterDefault_Root_on()
  58. # Unique IDs for all statechart nodes
  59. Root = 0
  60. Root_on = 1
  61. Root_on_interrupted = 2
  62. Root_on_normal = 3
  63. Root_on_interrupted_yellow = 4
  64. Root_on_interrupted_black = 5
  65. Root_on_normal_yellow = 6
  66. Root_on_normal_red = 7
  67. Root_on_normal_green = 8
  68. Root_off = 9
  69. # Statechart enter/exit action method(s)
  70. def enter_Root_on(self):
  71. self.current_state[self.Root].append(self.Root_on)
  72. def exit_Root_on(self):
  73. if self.Root_on_interrupted in self.current_state[self.Root_on]:
  74. self.exit_Root_on_interrupted()
  75. if self.Root_on_normal in self.current_state[self.Root_on]:
  76. self.exit_Root_on_normal()
  77. self.current_state[self.Root] = []
  78. def enter_Root_on_interrupted(self):
  79. self.current_state[self.Root_on].append(self.Root_on_interrupted)
  80. def exit_Root_on_interrupted(self):
  81. if self.Root_on_interrupted_yellow in self.current_state[self.Root_on_interrupted]:
  82. self.exit_Root_on_interrupted_yellow()
  83. if self.Root_on_interrupted_black in self.current_state[self.Root_on_interrupted]:
  84. self.exit_Root_on_interrupted_black()
  85. self.current_state[self.Root_on] = []
  86. def enter_Root_on_normal(self):
  87. self.current_state[self.Root_on].append(self.Root_on_normal)
  88. def exit_Root_on_normal(self):
  89. self.history_state[self.Root_on_normal] = self.current_state[self.Root_on_normal]
  90. if self.Root_on_normal_yellow in self.current_state[self.Root_on_normal]:
  91. self.exit_Root_on_normal_yellow()
  92. if self.Root_on_normal_red in self.current_state[self.Root_on_normal]:
  93. self.exit_Root_on_normal_red()
  94. if self.Root_on_normal_green in self.current_state[self.Root_on_normal]:
  95. self.exit_Root_on_normal_green()
  96. self.current_state[self.Root_on] = []
  97. def enter_Root_on_interrupted_yellow(self):
  98. self.timers[0] = 0.5
  99. self.setYellow()
  100. self.current_state[self.Root_on_interrupted].append(self.Root_on_interrupted_yellow)
  101. def exit_Root_on_interrupted_yellow(self):
  102. self.timers.pop(0, None)
  103. self.current_state[self.Root_on_interrupted] = []
  104. def enter_Root_on_interrupted_black(self):
  105. self.timers[1] = 0.5
  106. self.clear()
  107. self.current_state[self.Root_on_interrupted].append(self.Root_on_interrupted_black)
  108. def exit_Root_on_interrupted_black(self):
  109. self.timers.pop(1, None)
  110. self.current_state[self.Root_on_interrupted] = []
  111. def enter_Root_on_normal_yellow(self):
  112. self.timers[2] = 1.0
  113. self.setYellow()
  114. self.current_state[self.Root_on_normal].append(self.Root_on_normal_yellow)
  115. def exit_Root_on_normal_yellow(self):
  116. self.timers.pop(2, None)
  117. self.current_state[self.Root_on_normal] = []
  118. def enter_Root_on_normal_red(self):
  119. self.timers[3] = 3.0
  120. self.setRed()
  121. self.current_state[self.Root_on_normal].append(self.Root_on_normal_red)
  122. def exit_Root_on_normal_red(self):
  123. self.timers.pop(3, None)
  124. self.current_state[self.Root_on_normal] = []
  125. def enter_Root_on_normal_green(self):
  126. self.timers[4] = 2.0
  127. self.setGreen()
  128. self.current_state[self.Root_on_normal].append(self.Root_on_normal_green)
  129. def exit_Root_on_normal_green(self):
  130. self.timers.pop(4, None)
  131. self.current_state[self.Root_on_normal] = []
  132. def enter_Root_off(self):
  133. self.clear()
  134. self.current_state[self.Root].append(self.Root_off)
  135. def exit_Root_off(self):
  136. self.current_state[self.Root] = []
  137. # Statechart enter/exit default method(s)
  138. def enterDefault_Root_on(self):
  139. self.enter_Root_on()
  140. self.enterDefault_Root_on_normal()
  141. def enterDefault_Root_on_interrupted(self):
  142. self.enter_Root_on_interrupted()
  143. self.enter_Root_on_interrupted_yellow()
  144. def enterDefault_Root_on_normal(self):
  145. self.enter_Root_on_normal()
  146. self.enter_Root_on_normal_red()
  147. # Statechart enter/exit history method(s)
  148. def enterHistoryShallow_Root_on_normal(self):
  149. if len(self.history_state[self.Root_on_normal]) == 0:
  150. self.enter_Root_on_normal_red()
  151. else:
  152. if self.Root_on_normal_yellow in self.history_state[self.Root_on_normal]:
  153. self.enter_Root_on_normal_yellow()
  154. if self.Root_on_normal_red in self.history_state[self.Root_on_normal]:
  155. self.enter_Root_on_normal_red()
  156. if self.Root_on_normal_green in self.history_state[self.Root_on_normal]:
  157. self.enter_Root_on_normal_green()
  158. # Statechart transitions
  159. def generateCandidatesChildren_Root(self):
  160. if self.current_state[self.Root][0] == self.Root_on:
  161. return self.generateCandidates_Root_on()
  162. elif self.current_state[self.Root][0] == self.Root_off:
  163. return self.generateCandidates_Root_off()
  164. return False
  165. def generateCandidates_Root(self):
  166. if not self.combo_step.isArenaChanged(self.Root):
  167. return self.generateCandidatesChildren_Root()
  168. return False
  169. def generateCandidatesChildren_Root_on(self):
  170. if self.current_state[self.Root_on][0] == self.Root_on_interrupted:
  171. return self.generateCandidates_Root_on_interrupted()
  172. elif self.current_state[self.Root_on][0] == self.Root_on_normal:
  173. return self.generateCandidates_Root_on_normal()
  174. return False
  175. def generateCandidatesCurrent_Root_on(self):
  176. enabled_events = self.getEnabledEvents()
  177. for e in enabled_events:
  178. if (e.name == "stop_clicked") and (e.port == "ui"):
  179. self.small_step.addCandidate(self.transition_Root_on_1, e.parameters)
  180. return True
  181. return False
  182. def generateCandidates_Root_on(self):
  183. branch_done = False
  184. if not self.combo_step.isArenaChanged(self.Root_on):
  185. if self.semantics.priority == StatechartSemantics.SourceParent:
  186. branch_done = self.generateCandidatesCurrent_Root_on()
  187. if not branch_done:
  188. branch_done = self.generateCandidatesChildren_Root_on()
  189. elif self.semantics.priority == StatechartSemantics.SourceChild:
  190. branch_done = self.generateCandidatesChildren_Root_on()
  191. if not branch_done:
  192. branch_done = self.generateCandidatesCurrent_Root_on()
  193. return branch_done
  194. def transition_Root_on_1(self, parameters):
  195. self.exit_Root_on()
  196. self.combo_step.setArenaChanged(self.Root)
  197. self.enter_Root_off()
  198. def generateCandidatesChildren_Root_on_interrupted(self):
  199. if self.current_state[self.Root_on_interrupted][0] == self.Root_on_interrupted_yellow:
  200. return self.generateCandidates_Root_on_interrupted_yellow()
  201. elif self.current_state[self.Root_on_interrupted][0] == self.Root_on_interrupted_black:
  202. return self.generateCandidates_Root_on_interrupted_black()
  203. return False
  204. def generateCandidatesCurrent_Root_on_interrupted(self):
  205. enabled_events = self.getEnabledEvents()
  206. for e in enabled_events:
  207. if (e.name == "police_interrupt_clicked") and (e.port == "ui"):
  208. self.small_step.addCandidate(self.transition_Root_on_interrupted_1, e.parameters)
  209. return True
  210. return False
  211. def generateCandidates_Root_on_interrupted(self):
  212. branch_done = False
  213. if not self.combo_step.isArenaChanged(self.Root_on_interrupted):
  214. if self.semantics.priority == StatechartSemantics.SourceParent:
  215. branch_done = self.generateCandidatesCurrent_Root_on_interrupted()
  216. if not branch_done:
  217. branch_done = self.generateCandidatesChildren_Root_on_interrupted()
  218. elif self.semantics.priority == StatechartSemantics.SourceChild:
  219. branch_done = self.generateCandidatesChildren_Root_on_interrupted()
  220. if not branch_done:
  221. branch_done = self.generateCandidatesCurrent_Root_on_interrupted()
  222. return branch_done
  223. def transition_Root_on_interrupted_1(self, parameters):
  224. self.exit_Root_on_interrupted()
  225. self.combo_step.setArenaChanged(self.Root_on)
  226. self.enter_Root_on_normal()
  227. self.enterHistoryShallow_Root_on_normal()
  228. def generateCandidatesCurrent_Root_on_interrupted_yellow(self):
  229. enabled_events = self.getEnabledEvents()
  230. for e in enabled_events:
  231. if e.name == "_0after":
  232. self.small_step.addCandidate(self.transition_Root_on_interrupted_yellow_1, e.parameters)
  233. return True
  234. return False
  235. def generateCandidates_Root_on_interrupted_yellow(self):
  236. if not self.combo_step.isArenaChanged(self.Root_on_interrupted_yellow):
  237. return self.generateCandidatesCurrent_Root_on_interrupted_yellow()
  238. return False
  239. def transition_Root_on_interrupted_yellow_1(self, parameters):
  240. self.exit_Root_on_interrupted_yellow()
  241. self.combo_step.setArenaChanged(self.Root_on_interrupted)
  242. self.enter_Root_on_interrupted_black()
  243. def generateCandidatesCurrent_Root_on_interrupted_black(self):
  244. enabled_events = self.getEnabledEvents()
  245. for e in enabled_events:
  246. if e.name == "_1after":
  247. self.small_step.addCandidate(self.transition_Root_on_interrupted_black_1, e.parameters)
  248. return True
  249. return False
  250. def generateCandidates_Root_on_interrupted_black(self):
  251. if not self.combo_step.isArenaChanged(self.Root_on_interrupted_black):
  252. return self.generateCandidatesCurrent_Root_on_interrupted_black()
  253. return False
  254. def transition_Root_on_interrupted_black_1(self, parameters):
  255. self.exit_Root_on_interrupted_black()
  256. self.combo_step.setArenaChanged(self.Root_on_interrupted)
  257. self.enter_Root_on_interrupted_yellow()
  258. def generateCandidatesChildren_Root_on_normal(self):
  259. if self.current_state[self.Root_on_normal][0] == self.Root_on_normal_yellow:
  260. return self.generateCandidates_Root_on_normal_yellow()
  261. elif self.current_state[self.Root_on_normal][0] == self.Root_on_normal_red:
  262. return self.generateCandidates_Root_on_normal_red()
  263. elif self.current_state[self.Root_on_normal][0] == self.Root_on_normal_green:
  264. return self.generateCandidates_Root_on_normal_green()
  265. return False
  266. def generateCandidatesCurrent_Root_on_normal(self):
  267. enabled_events = self.getEnabledEvents()
  268. for e in enabled_events:
  269. if (e.name == "police_interrupt_clicked") and (e.port == "ui"):
  270. self.small_step.addCandidate(self.transition_Root_on_normal_1, e.parameters)
  271. return True
  272. return False
  273. def generateCandidates_Root_on_normal(self):
  274. branch_done = False
  275. if not self.combo_step.isArenaChanged(self.Root_on_normal):
  276. if self.semantics.priority == StatechartSemantics.SourceParent:
  277. branch_done = self.generateCandidatesCurrent_Root_on_normal()
  278. if not branch_done:
  279. branch_done = self.generateCandidatesChildren_Root_on_normal()
  280. elif self.semantics.priority == StatechartSemantics.SourceChild:
  281. branch_done = self.generateCandidatesChildren_Root_on_normal()
  282. if not branch_done:
  283. branch_done = self.generateCandidatesCurrent_Root_on_normal()
  284. return branch_done
  285. def transition_Root_on_normal_1(self, parameters):
  286. self.exit_Root_on_normal()
  287. self.combo_step.setArenaChanged(self.Root_on)
  288. self.enterDefault_Root_on_interrupted()
  289. def generateCandidatesCurrent_Root_on_normal_yellow(self):
  290. enabled_events = self.getEnabledEvents()
  291. for e in enabled_events:
  292. if e.name == "_2after":
  293. self.small_step.addCandidate(self.transition_Root_on_normal_yellow_1, e.parameters)
  294. return True
  295. return False
  296. def generateCandidates_Root_on_normal_yellow(self):
  297. if not self.combo_step.isArenaChanged(self.Root_on_normal_yellow):
  298. return self.generateCandidatesCurrent_Root_on_normal_yellow()
  299. return False
  300. def transition_Root_on_normal_yellow_1(self, parameters):
  301. self.exit_Root_on_normal_yellow()
  302. self.combo_step.setArenaChanged(self.Root_on_normal)
  303. self.enter_Root_on_normal_red()
  304. def generateCandidatesCurrent_Root_on_normal_red(self):
  305. enabled_events = self.getEnabledEvents()
  306. for e in enabled_events:
  307. if e.name == "_3after":
  308. self.small_step.addCandidate(self.transition_Root_on_normal_red_1, e.parameters)
  309. return True
  310. return False
  311. def generateCandidates_Root_on_normal_red(self):
  312. if not self.combo_step.isArenaChanged(self.Root_on_normal_red):
  313. return self.generateCandidatesCurrent_Root_on_normal_red()
  314. return False
  315. def transition_Root_on_normal_red_1(self, parameters):
  316. self.exit_Root_on_normal_red()
  317. self.combo_step.setArenaChanged(self.Root_on_normal)
  318. self.enter_Root_on_normal_green()
  319. def generateCandidatesCurrent_Root_on_normal_green(self):
  320. enabled_events = self.getEnabledEvents()
  321. for e in enabled_events:
  322. if e.name == "_4after":
  323. self.small_step.addCandidate(self.transition_Root_on_normal_green_1, e.parameters)
  324. return True
  325. return False
  326. def generateCandidates_Root_on_normal_green(self):
  327. if not self.combo_step.isArenaChanged(self.Root_on_normal_green):
  328. return self.generateCandidatesCurrent_Root_on_normal_green()
  329. return False
  330. def transition_Root_on_normal_green_1(self, parameters):
  331. self.exit_Root_on_normal_green()
  332. self.combo_step.setArenaChanged(self.Root_on_normal)
  333. self.enter_Root_on_normal_yellow()
  334. def generateCandidates_Root_off(self):
  335. return False
  336. # Generate transition candidates for current small step
  337. def generateCandidates(self):
  338. self.generateCandidates_Root()
  339. class MainApp(RuntimeClassBase):
  340. def __init__(self, controller):
  341. RuntimeClassBase.__init__(self, controller)
  342. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  343. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  344. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  345. self.semantics.priority = StatechartSemantics.SourceParent
  346. self.semantics.concurrency = StatechartSemantics.Single
  347. # Call user defined constructor
  348. MainApp.user_defined_constructor(self)
  349. def user_defined_constructor(self):
  350. self.canvas = ui.append_canvas(ui.window, 100, 310, {'background':'#eee'})
  351. police_button = ui.append_button(ui.window, 'Police interrupt')
  352. stop_button = ui.append_button(ui.window, 'Stop')
  353. ui.bind_event(police_button.element, ui.EVENTS.MOUSE_CLICK, self.controller, 'police_interrupt_clicked')
  354. ui.bind_event(stop_button.element, ui.EVENTS.MOUSE_CLICK, self.controller, 'stop_clicked')
  355. def user_defined_destructor(self):
  356. pass
  357. def initializeStatechart(self):
  358. self.current_state[self.Root] = []
  359. # Enter default state
  360. self.enter_Root_initializing()
  361. # Unique IDs for all statechart nodes
  362. Root = 0
  363. Root_initialized = 1
  364. Root_initializing = 2
  365. Root_creating = 3
  366. # Statechart enter/exit action method(s)
  367. def enter_Root_initialized(self):
  368. self.current_state[self.Root].append(self.Root_initialized)
  369. def exit_Root_initialized(self):
  370. self.current_state[self.Root] = []
  371. def enter_Root_initializing(self):
  372. self.current_state[self.Root].append(self.Root_initializing)
  373. def exit_Root_initializing(self):
  374. self.current_state[self.Root] = []
  375. def enter_Root_creating(self):
  376. self.current_state[self.Root].append(self.Root_creating)
  377. def exit_Root_creating(self):
  378. self.current_state[self.Root] = []
  379. # Statechart transitions
  380. def generateCandidatesChildren_Root(self):
  381. if self.current_state[self.Root][0] == self.Root_initialized:
  382. return self.generateCandidates_Root_initialized()
  383. elif self.current_state[self.Root][0] == self.Root_initializing:
  384. return self.generateCandidates_Root_initializing()
  385. elif self.current_state[self.Root][0] == self.Root_creating:
  386. return self.generateCandidates_Root_creating()
  387. return False
  388. def generateCandidates_Root(self):
  389. if not self.combo_step.isArenaChanged(self.Root):
  390. return self.generateCandidatesChildren_Root()
  391. return False
  392. def generateCandidates_Root_initialized(self):
  393. return False
  394. def generateCandidatesCurrent_Root_initializing(self):
  395. enabled_events = self.getEnabledEvents()
  396. self.small_step.addCandidate(self.transition_Root_initializing_1, [])
  397. return True
  398. return False
  399. def generateCandidates_Root_initializing(self):
  400. if not self.combo_step.isArenaChanged(self.Root_initializing):
  401. return self.generateCandidatesCurrent_Root_initializing()
  402. return False
  403. def transition_Root_initializing_1(self, parameters):
  404. self.exit_Root_initializing()
  405. self.big_step.outputEventOM(Event("create_instance", None, [self, 'trafficlight', 'TrafficLight', self.canvas]))
  406. self.combo_step.setArenaChanged(self.Root)
  407. self.enter_Root_creating()
  408. def generateCandidatesCurrent_Root_creating(self):
  409. enabled_events = self.getEnabledEvents()
  410. for e in enabled_events:
  411. if e.name == "instance_created":
  412. self.small_step.addCandidate(self.transition_Root_creating_1, e.parameters)
  413. return True
  414. return False
  415. def generateCandidates_Root_creating(self):
  416. if not self.combo_step.isArenaChanged(self.Root_creating):
  417. return self.generateCandidatesCurrent_Root_creating()
  418. return False
  419. def transition_Root_creating_1(self, parameters):
  420. association_name = parameters[0]
  421. self.exit_Root_creating()
  422. self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
  423. self.big_step.outputEventOM(Event("narrow_cast", None, [self, association_name, Event("set_association_name", None, [association_name])]))
  424. self.combo_step.setArenaChanged(self.Root)
  425. self.enter_Root_initialized()
  426. # Generate transition candidates for current small step
  427. def generateCandidates(self):
  428. self.generateCandidates_Root()
  429. class ObjectManager(ObjectManagerBase):
  430. def __init__(self, controller):
  431. ObjectManagerBase.__init__(self, controller)
  432. def instantiate(self, class_name, construct_params):
  433. if class_name == "TrafficLight":
  434. instance = TrafficLight(self.controller, construct_params[0])
  435. instance.associations = {}
  436. elif class_name == "MainApp":
  437. instance = MainApp(self.controller)
  438. instance.associations = {}
  439. instance.associations["trafficlight"] = Association("TrafficLight", 0, -1)
  440. return instance
  441. class Controller(GameLoopControllerBase):
  442. def __init__(self):
  443. GameLoopControllerBase.__init__(self, ObjectManager(self))
  444. self.addInputPort("ui")
  445. self.object_manager.createInstance("MainApp", [])