traffic.sccd 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. Diagram(name = 'Traffic_Light',
  2. author = 'Raphael Mannadiar',
  3. description = 'PIM Traffic lights.'):
  4. Top {}
  5. Inport(name = 'ui')
  6. Class(name = 'MainApp', default = True):
  7. Association(name = 'trafficlight', class = 'TrafficLight')
  8. Constructor {
  9. self.canvas = ui->append_canvas(ui.window,100,310,['background':'#eee'])
  10. Button police_button = ui->append_button(ui.window, 'Police interrupt')
  11. Button stop_button = ui->append_button(ui.window, 'Stop')
  12. ui->bind_event(police_button.element, ui.EVENTS.MOUSE_CLICK, self.controller, 'police_interrupt_clicked')
  13. ui->bind_event(stop_button.element, ui.EVENTS.MOUSE_CLICK, self.controller, 'stop_clicked')
  14. }
  15. StateMachine:
  16. initial = 'initializing'
  17. State('initializing'):
  18. Transition(target='../creating'):
  19. raise += { scope=cd, create_instance("trafficlight", "TrafficLight", self.canvas) }
  20. State('creating'):
  21. Transition(target='../initialized'):
  22. event = instance_created(association_name: string)
  23. raise += { scope=cd, start_instance(association_name) }
  24. raise += { scope=narrow, target=association_name, set_association_name(association_name) }
  25. State('initialized')
  26. Class(name = 'TrafficLight'):
  27. Constructor(canvas) {
  28. Integer size = 100
  29. Integer offset = size + 5
  30. self.RED = 0
  31. self.YELLOW = 1
  32. self.GREEN = 2
  33. self.colors = ['#f00','#ff0','#0f0']
  34. self.lights = [canvas->add_rectangle(size/2, size / 2, size, size, ['fill':'#000']),
  35. canvas->add_rectangle(size / 2, size / 2 + offset, size, size, ['fill':'#000']),
  36. canvas->add_rectangle(size / 2, size / 2 + 2 * offset, size, size, ['fill':'#000'])]
  37. }
  38. Method clear() {
  39. self.lights[self.RED]->set_color('#000')
  40. self.lights[self.YELLOW]->set_color('#000')
  41. self.lights[self.GREEN]->set_color('#000')
  42. }
  43. Method setGreen() {
  44. self->clear()
  45. self.lights[self.GREEN]->set_color(self.colors[self.GREEN])
  46. }
  47. Method setYellow() {
  48. self->clear()
  49. self.lights[self.YELLOW]->set_color(self.colors[self.YELLOW])
  50. }
  51. Method setRed() {
  52. self->clear()
  53. self.lights[self.RED]->set_color(self.colors[self.RED])
  54. }
  55. StateMachine:
  56. initial = 'on'
  57. State('on'):
  58. initial = 'normal'
  59. State('normal'):
  60. initial = 'red'
  61. State('red'):
  62. Transition(after=3.0, target='../green')
  63. OnEnter {
  64. self->setRed()
  65. }
  66. State('green'):
  67. Transition(after=2.0, target='../yellow')
  68. OnEnter {
  69. self->setGreen()
  70. }
  71. State('yellow'):
  72. Transition(after=1.0, target='../red')
  73. OnEnter {
  74. self->setYellow()
  75. }
  76. Transition(port='ui', target='../interrupted'):
  77. event = police_interrupt_clicked()
  78. history = 'history'
  79. State('interrupted'):
  80. initial = 'yellow'
  81. State('yellow'):
  82. Transition(after=.5, target='../black')
  83. OnEnter {
  84. self->setYellow()
  85. }
  86. State('black'):
  87. Transition(after=.5, target='../yellow')
  88. OnEnter {
  89. self->clear()
  90. }
  91. Transition(port='ui', target='../normal/history'):
  92. event = police_interrupt_clicked()
  93. Transition(port='ui', target='../off'):
  94. event = stop_clicked()
  95. State('off'):
  96. OnEnter {
  97. self->clear()
  98. }