include "primitives.alh" Diagram dynamic_trafficlight { name = "Dynamic Traffic Light" author = "Yentl Van Tendeloo" } Class manager { name = "Manager" default = True constructor_body = $ Void function constructor(attributes : Element, parameters : Element): dict_add(attributes, "trafficlights", list_create()) return ! $ {behaviour} CompositeState manager_main { name = "main" isInitial = True {composite_children} ParallelState manager_main_parallel { name = "parallel" isInitial = True {parallel_children} CompositeState manager_main_parallel_core { name = "core" isInitial = True {composite_children} BasicState manager_main_parallel_core_start { name = "start" isInitial = True } } {parallel_children} CompositeState manager_main_parallel_input { name = "input" isInitial = True {composite_children} BasicState manager_main_parallel_input_1 { name = "1" isInitial = True } {composite_children} BasicState manager_main_parallel_input_2 { name = "2" isInitial = False } {composite_children} BasicState manager_main_parallel_input_3 { name = "3" isInitial = False } {composite_children} BasicState manager_main_parallel_input_4 { name = "4" isInitial = False } {composite_children} BasicState manager_main_parallel_input_5 { name = "5" isInitial = False } {composite_children} BasicState manager_main_parallel_input_6 { name = "6" isInitial = False } {composite_children} BasicState manager_main_parallel_input_7 { name = "7" isInitial = False } {composite_children} BasicState manager_main_parallel_input_8 { name = "8" isInitial = False } {composite_children} BasicState manager_main_parallel_input_9 { name = "9" isInitial = False } {composite_children} BasicState manager_main_parallel_input_10 { name = "10" isInitial = False } {composite_children} BasicState manager_main_parallel_input_11 { name = "11" isInitial = False } {composite_children} BasicState manager_main_parallel_input_12 { name = "12" isInitial = False } } } } } transition (manager_main_parallel_input_1, manager_main_parallel_input_2) { name = "" after = $ Element function after(attributes : Element): return 1.0! $ {transition_raises} Raise { scope = "broad" event = "create" parameter = $ Element function raise(attributes : Element, parameters : Element): return list_create()! $ } } transition (manager_main_parallel_input_2, manager_main_parallel_input_3) { name = "" after = $ Element function after(attributes : Element): return 4.0! $ {transition_raises} Raise { scope = "broad" event = "toggle" parameter = $ Element function raise(attributes : Element, parameters : Element): return list_create()! $ } } transition (manager_main_parallel_input_3, manager_main_parallel_input_4) { name = "" after = $ Element function after(attributes : Element): return 10.0! $ {transition_raises} Raise { scope = "broad" event = "create" parameter = $ Element function raise(attributes : Element, parameters : Element): return list_create()! $ } } transition (manager_main_parallel_input_4, manager_main_parallel_input_5) { name = "" after = $ Element function after(attributes : Element): return 5.0! $ {transition_raises} Raise { scope = "broad" event = "police_interrupt" parameter = $ Element function raise(attributes : Element, parameters : Element): return list_create()! $ } } transition (manager_main_parallel_input_5, manager_main_parallel_input_6) { name = "" after = $ Element function after(attributes : Element): return 9.4! $ {transition_raises} Raise { scope = "broad" event = "toggle" parameter = $ Element function raise(attributes : Element, parameters : Element): return list_create()! $ } } transition (manager_main_parallel_input_6, manager_main_parallel_input_7) { name = "" after = $ Element function after(attributes : Element): return 100.0! $ {transition_raises} Raise { scope = "broad" event = "toggle" parameter = $ Element function raise(attributes : Element, parameters : Element): return list_create()! $ } } transition (manager_main_parallel_input_7, manager_main_parallel_input_8) { name = "" after = $ Element function after(attributes : Element): return 10.0! $ {transition_raises} Raise { scope = "broad" event = "police_interrupt" parameter = $ Element function raise(attributes : Element, parameters : Element): return list_create()! $ } } transition (manager_main_parallel_input_8, manager_main_parallel_input_9) { name = "" after = $ Element function after(attributes : Element): return 5.0! $ {transition_raises} Raise { scope = "broad" event = "delete" parameter = $ Element function raise(attributes : Element, parameters : Element): return list_create()! $ } } transition (manager_main_parallel_input_9, manager_main_parallel_input_10) { name = "" after = $ Element function after(attributes : Element): return 4.0! $ {transition_raises} Raise { scope = "broad" event = "delete" parameter = $ Element function raise(attributes : Element, parameters : Element): return list_create()! $ } } transition (manager_main_parallel_input_10, manager_main_parallel_input_11) { name = "" after = $ Element function after(attributes : Element): return 5.0! $ {transition_raises} Raise { scope = "broad" event = "exit" parameter = $ Element function raise(attributes : Element, parameters : Element): return list_create()! $ } } transition (manager_main_parallel_core_start, manager_main_parallel_core_start) { name = "create" event = "create" {transition_raises} Raise { scope = "cd" event = "create_instance" parameter = $ Element function raise(attributes : Element, parameters : Element): Element result result = list_create() list_append(result, "trafficlights") list_append(result, "TrafficLight") list_append(result, read_root()) return result! $ } } transition (manager_main_parallel_core_start, manager_main_parallel_core_start) { name = "created" event = "instance_created" script = $ Void function script(attributes : Element, parameters : Element): list_append(attributes["trafficlights"], parameters[0]) return! $ } transition (manager_main_parallel_core_start, manager_main_parallel_core_start) { name = "exit" event = "exit" {transition_raises} Raise { scope = "cd" event = "delete_instance" parameter = $ Element function raise(attributes : Element, parameters : Element): Element result result = list_create() list_append(result, "0") return result! $ } } transition (manager_main_parallel_core_start, manager_main_parallel_core_start) { name = "delete" event = "delete" {transition_raises} Raise { scope = "cd" event = "delete_instance" parameter = $ Element function raise(attributes : Element, parameters : Element): Element result result = list_create() list_append(result, list_pop_final(attributes["trafficlights"])) return result! $ } } Class trafficlight { name = "TrafficLight" default = False constructor_body = $ Void function constructor(attributes : Element, parameters : Element): dict_add(attributes, "counter", 0) dict_add(attributes, "colour", "") return! $ {behaviour} CompositeState trafficlight_main { name = "main" isInitial = True {composite_children} BasicState trafficlight_main_off { name = "off" isInitial = True } {composite_children} ParallelState trafficlight_main_main { name = "main" isInitial = False {onExitRaise} Raise { event = "displayNone" scope = "output" } {parallel_children} CompositeState trafficlight_main_main_trafficlight { name = "trafficlight" isInitial = False {composite_children} CompositeState trafficlight_main_main_trafficlight_normal { name = "normal" isInitial = True onExitScript = $ Void function onexit(attributes : Element): dict_overwrite(attributes, "colour", "") return! $ {composite_children} BasicState trafficlight_main_main_trafficlight_normal_red { name = "red" isInitial = True onEntryScript = $ Void function onentry(attributes : Element): dict_overwrite(attributes, "counter", 60) dict_overwrite(attributes, "colour", "red") return! $ {onEntryRaise} Raise { event = "displayRed" scope = "output" } {onEntryRaise} Raise { event = "resetTimer" scope = "output" } } {composite_children} BasicState trafficlight_main_main_trafficlight_normal_green { name = "green" isInitial = False onEntryScript = $ Void function onentry(attributes : Element): dict_overwrite(attributes, "counter", 55) dict_overwrite(attributes, "colour", "green") return! $ {onEntryRaise} Raise { event = "displayGreen" scope = "output" } {onEntryRaise} Raise { event = "resetTimer" scope = "output" } } {composite_children} BasicState trafficlight_main_main_trafficlight_normal_yellow { name = "yellow" isInitial = False onEntryScript = $ Void function onentry(attributes : Element): dict_overwrite(attributes, "colour", "") return! $ {onEntryRaise} Raise { event = "displayYellow" scope = "output" } {onEntryRaise} Raise { event = "disableTimer" scope = "output" } } {composite_children} HistoryState trafficlight_main_main_trafficlight_normal_hist { name = "hist" } } {composite_children} CompositeState trafficlight_main_main_trafficlight_interrupted { {composite_children} BasicState trafficlight_main_main_trafficlight_interrupted_yellow { name = "yellow" isInitial = True {onEntryRaise} Raise { event = "displayYellow" scope = "output" } } {composite_children} BasicState trafficlight_main_main_trafficlight_interrupted_black { name = "black" isInitial = False {onEntryRaise} Raise { event = "displayNone" scope = "output" } } } } {parallel_children} CompositeState trafficlight_main_main_timer { name = "timer" isInitial = False {composite_children} BasicState trafficlight_main_main_timer_disabled { name = "disabled" isInitial = False } {composite_children} CompositeState trafficlight_main_main_timer_running { name = "running" isInitial = True {onExitRaise} Raise { event = "updateTimerValue" scope = "output" parameter = $ Element function parameter(attributes : Element): return -1! $ } {composite_children} BasicState trafficlight_main_main_timer_running_decidingcolor { name = "decidingcolor" isInitial = True } {composite_children} BasicState trafficlight_main_main_timer_running_green { name = "green" isInitial = False {onEntryRaise} Raise { event = "updateTimerValue" scope = "output" parameter = $ Element function raise(attributes : Element): return attributes["counter"]! $ } } {composite_children} BasicState trafficlight_main_main_timer_running_red { name = "red" isInitial = False {onEntryRaise} Raise { event = "updateTimerValue" parameter = $ Element function raise(attributes : Element): return attributes["counter"]! $ } } } } } } } transition (trafficlight_main_off, trafficlight_main_main) { name = "toggle" event = "toggle" } transition (trafficlight_main_main, trafficlight_main_off) { name = "toggle" event = "toggle" } transition (trafficlight_main_main_trafficlight_normal, trafficlight_main_main_trafficlight_interrupted) { name = "police_interrupt / disableTimer" event = "police_interrupt" {transition_raises} Raise { event = "disableTimer" } } transition (trafficlight_main_main_trafficlight_interrupted, trafficlight_main_main_trafficlight_normal_hist) { name = "police_interrupt / enableTimer" event = "police_interrupt" {transition_raises} Raise { event = "enableTimer" } } transition (trafficlight_main_main_trafficlight_normal_red, trafficlight_main_main_trafficlight_normal_green) { name = "after 60s" after = $ Float function after(attributes : Element): return 60.0! $ } transition (trafficlight_main_main_trafficlight_normal_green, trafficlight_main_main_trafficlight_normal_yellow) { name = "after 55s" after = $ Float function after(attributes : Element): return 55.0! $ } transition (trafficlight_main_main_trafficlight_normal_yellow, trafficlight_main_main_trafficlight_normal_red) { name = "after 5s" after = $ Float function after(attributes : Element): return 5.0! $ {transition_raises} Raise { event = "enableTimer" } } transition (trafficlight_main_main_trafficlight_interrupted_yellow, trafficlight_main_main_trafficlight_interrupted_black) { name = "after 500ms" after = $ Float function after(attributes : Element): return 0.5! $ } transition (trafficlight_main_main_trafficlight_interrupted_black, trafficlight_main_main_trafficlight_interrupted_yellow) { name = "after 500ms" after = $ Float function after(attributes : Element): return 0.5! $ } transition (trafficlight_main_main_timer_disabled, trafficlight_main_main_timer_running) { name = "enableTimer" event = "enableTimer" } transition (trafficlight_main_main_timer_running, trafficlight_main_main_timer_disabled) { name = "disableTimer" event = "disableTimer" } transition (trafficlight_main_main_timer_running, trafficlight_main_main_timer_running) { name = "resetTimer" event = "resetTimer" } transition (trafficlight_main_main_timer_running_decidingcolor, trafficlight_main_main_timer_running_green) { name = "[green] / updateTimerColour" cond = $ Boolean function cond(attributes : Element, parameters : Element): return value_eq(attributes["colour"], "green")! $ {transition_raises} Raise { event = "updateTimerColour" scope = "output" parameter = $ Element function param(attributes : Element, parameters : Element): return "green"! $ } } transition (trafficlight_main_main_timer_running_decidingcolor, trafficlight_main_main_timer_running_red) { name = "[red] / updateTimerColour" cond = $ Boolean function cond(attributes : Element, parameters : Element): return value_eq(attributes["colour"], "red")! $ {transition_raises} Raise { event = "updateTimerColour" scope = "output" parameter = $ Element function param(attributes : Element, parameters : Element): return "red"! $ } } transition (trafficlight_main_main_timer_running_red, trafficlight_main_main_timer_running_red) { name = "after 1s / counter -= 1" after = $ Float function after(attributes : Element): return 1.0! $ script = $ Void function script(attributes : Element, parameters : Element): dict_overwrite(attributes, "counter", integer_subtraction(attributes["counter"], 1)) return! $ {transition_raises} Raise { event = "updateTimerValue" scope = "output" parameter = $ Element function param(attributes : Element, parameters : Element): return attributes["counter"]! $ } } transition (trafficlight_main_main_timer_running_green, trafficlight_main_main_timer_running_green) { name = "after 1s / counter -= 1" after = $ Float function after(attributes : Element): return 1.0! $ script = $ Void function script(attributes : Element, parameters : Element): dict_overwrite(attributes, "counter", integer_subtraction(attributes["counter"], 1)) return! $ {transition_raises} Raise { event = "updateTimerValue" scope = "output" parameter = $ Element function param(attributes : Element, parameters : Element): return attributes["counter"]! $ } }