Sam Pieters 1 éve
szülő
commit
ecd2d40de9

+ 9 - 13
examples/BouncingBalls/PyDEVS/target.py

@@ -1,21 +1,19 @@
 """
 """
 Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration) and Sam Pieters (DEVS)
 Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration) and Sam Pieters (DEVS)
 
 
-Model author: Simon Van Mierlo+Raphael Mannadiar
-Model name:   Bouncing_Balls_Python_Version
+Model author: Sam Pieters
+Model name:   Bouncing_Balls_DEVS_Version
 Model description:
 Model description:
 Tkinter frame with bouncing balls in it.
 Tkinter frame with bouncing balls in it.
 """
 """
 
 
 from sccd.runtime.DEVS_statecharts_core import *
 from sccd.runtime.DEVS_statecharts_core import *
 from sccd.runtime.libs import ui_v2 as ui
 from sccd.runtime.libs import ui_v2 as ui
-from sccd.runtime.libs.utils import utils
 import random
 import random
 
 
-CANVAS_WIDTH = 800
-CANVAS_HEIGHT = 550
+CANVAS_DIMS = (800, 550)
 
 
-# package "Bouncing_Balls_Python_Version"
+# package "Bouncing_Balls_DEVS_Version"
 
 
 class MainAppInstance(RuntimeClassBase):
 class MainAppInstance(RuntimeClassBase):
     def __init__(self, atomdevs):
     def __init__(self, atomdevs):
@@ -404,7 +402,7 @@ class FieldInstance(RuntimeClassBase):
         self.big_step.outputEvent(Event("create_window", self.getOutPortName("ui"), [800, 600, "BouncingBalls", self.inports['field_ui']]))
         self.big_step.outputEvent(Event("create_window", self.getOutPortName("ui"), [800, 600, "BouncingBalls", self.inports['field_ui']]))
     
     
     def _root_creating_canvas_enter(self):
     def _root_creating_canvas_enter(self):
-        self.big_step.outputEvent(Event("create_canvas", self.getOutPortName("ui"), [self.window_id, CANVAS_WIDTH, CANVAS_HEIGHT, {'background':'#eee'}, self.inports['field_ui']]))
+        self.big_step.outputEvent(Event("create_canvas", self.getOutPortName("ui"), [self.window_id, CANVAS_DIMS[0], CANVAS_DIMS[1], {'background':'#eee'}, self.inports['field_ui']]))
     
     
     def _root_creating_button_enter(self):
     def _root_creating_button_enter(self):
         self.big_step.outputEventOM(Event("create_instance", None, [self, "buttons", "Button", self.window_id, 'create_new_field', 'Spawn New Window']))
         self.big_step.outputEventOM(Event("create_instance", None, [self, "buttons", "Button", self.window_id, 'create_new_field', 'Spawn New Window']))
@@ -738,9 +736,9 @@ class BallInstance(RuntimeClassBase):
     
     
     def _main_behaviour_bouncing_0_exec(self, parameters):
     def _main_behaviour_bouncing_0_exec(self, parameters):
         # Invert velocity when colliding with canvas border:
         # Invert velocity when colliding with canvas border:
-        if self.pos['x']-self.r <= 0 or self.pos['x']+self.r >= CANVAS_WIDTH:
+        if self.pos['x']-self.r <= 0 or self.pos['x']+self.r >= CANVAS_DIMS[0]:
             self.vel['x'] = -self.vel['x'];
             self.vel['x'] = -self.vel['x'];
-        if self.pos['y']-self.r <= 0 or self.pos['y']+self.r >= CANVAS_HEIGHT:
+        if self.pos['y']-self.r <= 0 or self.pos['y']+self.r >= CANVAS_DIMS[1]:
             self.vel['y'] = -self.vel['y'];
             self.vel['y'] = -self.vel['y'];
         self.big_step.outputEvent(Event("move_element", self.getOutPortName("ui"), [self.canvas_id, self.circle_id, self.vel['x'], self.vel['y']]))
         self.big_step.outputEvent(Event("move_element", self.getOutPortName("ui"), [self.canvas_id, self.circle_id, self.vel['x'], self.vel['y']]))
         self.pos['x'] += self.vel['x']
         self.pos['x'] += self.vel['x']
@@ -763,8 +761,8 @@ class BallInstance(RuntimeClassBase):
         y = parameters[1]
         y = parameters[1]
         button = parameters[2]
         button = parameters[2]
         # Always keep ball within canvas:
         # Always keep ball within canvas:
-        x = min(max(0+self.r, x), CANVAS_WIDTH-self.r)
-        y = min(max(0+self.r, y), CANVAS_HEIGHT-self.r)
+        x = min(max(0+self.r, x), CANVAS_DIMS[0]-self.r)
+        y = min(max(0+self.r, y), CANVAS_DIMS[1]-self.r)
         
         
         dx = x - self.pos['x']
         dx = x - self.pos['x']
         dy = y - self.pos['y']
         dy = y - self.pos['y']
@@ -831,8 +829,6 @@ class ObjectManager(TheObjectManager):
 
 
 class Controller(CoupledDEVS):
 class Controller(CoupledDEVS):
     def __init__(self, name):
     def __init__(self, name):
-        self.terminate = False
-
         CoupledDEVS.__init__(self, name)
         CoupledDEVS.__init__(self, name)
         self.in_ui = self.addInPort("ui")
         self.in_ui = self.addInPort("ui")
         Ports.addInputPort("ui")
         Ports.addInputPort("ui")

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 890 - 1098
examples/BouncingBalls/PyDEVS/trace.txt


+ 9 - 11
examples/BouncingBalls/Python/target.py

@@ -1,21 +1,19 @@
 """
 """
 Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
 Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
 
 
-Model author: Simon Van Mierlo+Raphael Mannadiar
-Model name:   Bouncing_Balls_Python_Version
+Model author: Sam Pieters
+Model name:   Bouncing_Balls_DEVS_Version
 Model description:
 Model description:
 Tkinter frame with bouncing balls in it.
 Tkinter frame with bouncing balls in it.
 """
 """
 
 
 from sccd.runtime.statecharts_core import *
 from sccd.runtime.statecharts_core import *
 from sccd.runtime.libs import ui_v2 as ui
 from sccd.runtime.libs import ui_v2 as ui
-from sccd.runtime.libs.utils import utils
 import random
 import random
 
 
-CANVAS_WIDTH = 800
-CANVAS_HEIGHT = 550
+CANVAS_DIMS = (800, 550)
 
 
-# package "Bouncing_Balls_Python_Version"
+# package "Bouncing_Balls_DEVS_Version"
 
 
 class MainApp(RuntimeClassBase):
 class MainApp(RuntimeClassBase):
     def __init__(self, controller):
     def __init__(self, controller):
@@ -380,7 +378,7 @@ class Field(RuntimeClassBase):
         self.big_step.outputEvent(Event("create_window", self.getOutPortName("ui"), [800, 600, "BouncingBalls", self.inports['field_ui']]))
         self.big_step.outputEvent(Event("create_window", self.getOutPortName("ui"), [800, 600, "BouncingBalls", self.inports['field_ui']]))
     
     
     def _root_creating_canvas_enter(self):
     def _root_creating_canvas_enter(self):
-        self.big_step.outputEvent(Event("create_canvas", self.getOutPortName("ui"), [self.window_id, CANVAS_WIDTH, CANVAS_HEIGHT, {'background':'#eee'}, self.inports['field_ui']]))
+        self.big_step.outputEvent(Event("create_canvas", self.getOutPortName("ui"), [self.window_id, CANVAS_DIMS[0], CANVAS_DIMS[1], {'background':'#eee'}, self.inports['field_ui']]))
     
     
     def _root_creating_button_enter(self):
     def _root_creating_button_enter(self):
         self.big_step.outputEventOM(Event("create_instance", None, [self, "buttons", "Button", self.window_id, 'create_new_field', 'Spawn New Window']))
         self.big_step.outputEventOM(Event("create_instance", None, [self, "buttons", "Button", self.window_id, 'create_new_field', 'Spawn New Window']))
@@ -676,9 +674,9 @@ class Ball(RuntimeClassBase):
     
     
     def _main_behaviour_bouncing_0_exec(self, parameters):
     def _main_behaviour_bouncing_0_exec(self, parameters):
         # Invert velocity when colliding with canvas border:
         # Invert velocity when colliding with canvas border:
-        if self.pos['x']-self.r <= 0 or self.pos['x']+self.r >= CANVAS_WIDTH:
+        if self.pos['x']-self.r <= 0 or self.pos['x']+self.r >= CANVAS_DIMS[0]:
             self.vel['x'] = -self.vel['x'];
             self.vel['x'] = -self.vel['x'];
-        if self.pos['y']-self.r <= 0 or self.pos['y']+self.r >= CANVAS_HEIGHT:
+        if self.pos['y']-self.r <= 0 or self.pos['y']+self.r >= CANVAS_DIMS[1]:
             self.vel['y'] = -self.vel['y'];
             self.vel['y'] = -self.vel['y'];
         self.big_step.outputEvent(Event("move_element", self.getOutPortName("ui"), [self.canvas_id, self.circle_id, self.vel['x'], self.vel['y']]))
         self.big_step.outputEvent(Event("move_element", self.getOutPortName("ui"), [self.canvas_id, self.circle_id, self.vel['x'], self.vel['y']]))
         self.pos['x'] += self.vel['x']
         self.pos['x'] += self.vel['x']
@@ -701,8 +699,8 @@ class Ball(RuntimeClassBase):
         y = parameters[1]
         y = parameters[1]
         button = parameters[2]
         button = parameters[2]
         # Always keep ball within canvas:
         # Always keep ball within canvas:
-        x = min(max(0+self.r, x), CANVAS_WIDTH-self.r)
-        y = min(max(0+self.r, y), CANVAS_HEIGHT-self.r)
+        x = min(max(0+self.r, x), CANVAS_DIMS[0]-self.r)
+        y = min(max(0+self.r, y), CANVAS_DIMS[1]-self.r)
         
         
         dx = x - self.pos['x']
         dx = x - self.pos['x']
         dy = y - self.pos['y']
         dy = y - self.pos['y']

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 2472 - 34195
examples/BouncingBalls/Python/trace.txt


+ 0 - 405
examples/BouncingBalls/old_sccd.xml

@@ -1,405 +0,0 @@
-<?xml version="1.1" ?>
-<diagram author="Simon Van Mierlo+Raphael Mannadiar" name="Bouncing_Balls_Python_Version">
-    <description>
-        Tkinter frame with bouncing balls in it.
-    </description>
-    <top>
-        from sccd.runtime.libs.ui import ui
-        from sccd.runtime.libs.utils import utils
-        import random
-    </top>
-    <inport name="ui"/>
-    <class name="MainApp" default="true">
-        <relationships>
-            <association name="fields" class="Field" />
-        </relationships>
-        <constructor>
-            <body>
-                <![CDATA[
-                self.nr_of_fields = 0
-                ]]>
-            </body>
-        </constructor>
-        <scxml initial="running">
-            <state id="running" initial="root">
-                <parallel id="root">
-                    <state id="main_behaviour" initial="initializing">
-                        <state id="initializing">
-                            <transition target="../running">
-                                <raise event="create_field" />        
-                            </transition>
-                        </state>
-                        <state id="running">
-                            <transition target='.' event='button_pressed' cond='event_name == "create_new_field"'>
-                                <parameter name="event_name" type="str" />
-                                <raise event="create_field" />
-                            </transition>
-                        </state>
-                    </state>
-                    <state id="cd_behaviour" initial="waiting">
-                        <state id="waiting">
-                            <transition event="create_field" target="../creating">
-                                <raise scope="cd" event="create_instance">
-                                    <parameter expr='"fields"' />
-                                </raise>
-                            </transition>
-                            <transition event="delete_field" target='../check_nr_of_fields'>
-                                <parameter name="association_name" type="str"/>
-                                <raise scope="cd" event="delete_instance">
-                                    <parameter expr='association_name' />
-                                </raise>
-                                <script>
-                                    <![CDATA[
-                                    self.nr_of_fields -= 1
-                                    ]]>
-                                </script>
-                            </transition>
-                        </state>
-                        <state id="creating">
-                            <transition event="instance_created" target="../waiting">
-                                <parameter name="association_name" type="string"/>
-                                <raise scope="cd" event="start_instance">
-                                    <parameter expr="association_name" />
-                                </raise>
-                                <raise scope="narrow" event="set_association_name" target="association_name">
-                                    <parameter expr="association_name" />
-                                </raise>
-                                <script>
-                                    <![CDATA[
-                                    self.nr_of_fields += 1
-                                    ]]>
-                                </script>
-                            </transition>
-                        </state>
-                        <state id="check_nr_of_fields">
-                            <transition target="../stopped" cond="self.nr_of_fields == 0" after="0.05">
-                                <raise event="stop" />
-                            </transition>
-                            <transition target="../waiting" cond="self.nr_of_fields != 0"/>
-                        </state>
-                        <state id="stopped" />
-                    </state>
-                    <transition target="../stopped" event="stop">
-                        <script>
-                            <![CDATA[
-                            ui.close_window(ui.window)
-                            ]]>
-                        </script>
-                    </transition>
-                </parallel>
-                <state id="stopped" />
-            </state>
-        </scxml>
-    </class>
-
-    <class name="Field">
-        <attribute name="canvas" />
-        <attribute name="field_window" />
-        <inport name="field_ui"/>
-        <relationships>
-            <association name="balls" class="Ball" />
-            <association name="buttons" class="Button" />
-            <association name="parent" class="MainApp" min="1" max="1" />
-        </relationships>
-        <constructor>
-            <body>
-                <![CDATA[
-                self.field_window = ui.new_window(800,600,"BouncingBalls");
-                self.canvas = ui.append_canvas(self.field_window,800,550,{'background':'#eee'});
-                ui.bind_event(self.field_window, ui.EVENTS.WINDOW_CLOSE, self.controller, 'window_close', self.inports['field_ui']);
-                ui.bind_event(self.field_window, ui.EVENTS.KEY_PRESS, self.controller, 'key_press', self.inports['field_ui']);
-                ui.bind_event(self.canvas.element, ui.EVENTS.MOUSE_RIGHT_CLICK,    self.controller, 'right_click', self.inports['field_ui']);
-                ui.bind_event(self.canvas.element, ui.EVENTS.MOUSE_MOVE, self.controller, 'mouse_move', self.inports['field_ui']);
-                ui.bind_event(self.canvas.element, ui.EVENTS.MOUSE_RELEASE, self.controller, 'mouse_release', self.inports['field_ui']);
-                ]]>
-            </body>
-        </constructor>
-        <destructor>
-            <body>
-                <![CDATA[
-                ui.close_window(self.field_window);
-                ]]>
-            </body>
-        </destructor>
-        <scxml initial="root">
-            <state id="root" initial="waiting">
-                <state id="waiting">
-                    <transition event="set_association_name" target="../initializing">
-                        <parameter name="association_name" type="str" />
-                        <script>
-                            <![CDATA[
-                            self.association_name = association_name
-                            ]]>
-                        </script>
-                    </transition>
-                </state>
-                <state id="initializing">
-                    <transition target="../creating">
-                        <raise scope="cd" event="create_instance">
-                            <parameter expr='"buttons"' />
-                            <parameter expr='"Button"' />
-                            <parameter expr="self.field_window" />
-                            <parameter expr="'create_new_field'" />
-                            <parameter expr="'Spawn New Window'" />
-                        </raise>
-                    </transition>
-                </state>
-                <state id="creating">
-                    <transition event='instance_created' target='../packing'>
-                        <parameter name="association_name" type="string"/>
-                        <raise scope="cd" event="start_instance">
-                            <parameter expr="association_name" />
-                        </raise>
-                    </transition>
-                </state>
-                <state id="packing">
-                    <transition event="button_created" target='../running'>
-                    </transition>
-                </state>
-                <parallel id="running">
-                    <transition port="field_ui" event="window_close" target="../deleting">
-                        <raise event="delete_instance" scope="cd">
-                            <parameter expr='"buttons"' />
-                        </raise>
-                        <raise event="delete_instance" scope="cd">
-                            <parameter expr='"balls"' />
-                        </raise>
-                    </transition>
-                    <state id="main_behaviour" initial="running">
-                        <state id="running">
-                            <transition port="field_ui" event="right_click" target="../creating">
-                                <parameter name="x" />
-                                <parameter name="y" />
-                                <parameter name="button" />
-                                <raise scope="cd" event="create_instance">
-                                    <parameter expr='"balls"' />
-                                    <parameter expr='"Ball"' />
-                                    <parameter expr="self.canvas" />
-                                    <parameter expr="x" />
-                                    <parameter expr="y" />
-                                </raise>
-                            </transition>
-                        </state>
-                        <state id="creating">
-                            <transition event="instance_created" target="../running">
-                                <parameter name="association_name" type="string"/>
-                                <raise scope="cd" event="start_instance">
-                                    <parameter expr="association_name" />
-                                </raise>
-                                <raise scope="narrow" event="set_association_name" target="association_name">
-                                    <parameter expr="association_name" />
-                                </raise>
-                            </transition>
-                        </state>
-                    </state>
-                    <state id="deleting_behaviour" initial="running">
-                        <state id="running">
-                            <transition event="delete_ball" target='.'>
-                                <parameter name="association_name" type="str"/>
-                                <raise scope="cd" event="delete_instance">
-                                    <parameter expr='association_name' />
-                                </raise>
-                            </transition>
-                        </state>
-                    </state>
-                    <state id="child_behaviour" initial="listening">
-                        <state id="listening">
-                            <transition event="button_pressed" target='.'>
-                                <parameter name="event_name" type="str" />
-                                <raise event="button_pressed" scope="narrow" target="'parent'">
-                                    <parameter expr='event_name' />
-                                </raise>
-                            </transition>
-                        </state>
-                    </state>
-                    <state id="deleting_balls_behaviour" initial="listening">
-                        <state id="listening">
-                            <transition port="field_ui" event="key_press" target="." cond="key == ui.KEYCODES.DELETE">
-                                <parameter name="key" />
-                                <raise event="delete_self" scope="narrow" target="'balls'" />
-                            </transition>
-                        </state>
-                    </state>
-                </parallel>
-                <state id="deleting">
-                    <transition target="../deleted">
-                        <raise event="delete_field" scope="narrow" target="'parent'">
-                            <parameter expr='self.association_name' />
-                        </raise>
-                    </transition>
-                </state>
-                <state id="deleted" />
-            </state>
-        </scxml>
-    </class>
-    
-    <class name="Button">
-        <relationships>
-            <association name="parent" class="Field" min="1" max="1" />
-        </relationships>
-        <inport name="button_ui"/>
-        <constructor>
-            <parameter name="tkparent" type="object" />
-            <parameter name="event_name" type="str" />
-            <parameter name="button_text" type="str" />
-            <body>
-                <![CDATA[
-                self.event_name = event_name;
-                button = ui.append_button(tkparent, event_name);
-                ui.bind_event(button.element, ui.EVENTS.MOUSE_CLICK, self.controller, 'mouse_click', self.inports['button_ui']);
-                ]]>
-            </body>
-        </constructor>
-        <scxml initial="initializing">
-            <state id="initializing">
-                <transition target="../running">
-                    <raise event="button_created" scope="narrow" target="'parent'">
-                    </raise>
-                </transition>
-            </state>
-            <state id="running">
-                <transition port='button_ui' event="mouse_click" target='.' cond="button == ui.MOUSE_BUTTONS.LEFT">
-                    <parameter name="x" />
-                    <parameter name="y" />
-                    <parameter name="button" />
-                    <raise event="button_pressed" scope="narrow" target="'parent'">
-                        <parameter expr="self.event_name" />
-                    </raise>
-                </transition>
-            </state>
-        </scxml>
-    </class>
-    
-    <class name="Ball">
-        <atrribute name="element" />
-        <attribute name="canvas" />
-        <inport name="ball_ui" />
-        <relationships>
-            <association name="parent" class="Field" min="1" max="1" />
-        </relationships>
-        <constructor>
-            <parameter name="canvas" />
-            <parameter name="x" />
-            <parameter name="y" />
-            <body>
-                <![CDATA[
-                self.canvas = canvas;
-                self.r = 20.0;
-                self.vel = {'x': random.uniform(-5.0, 5.0), 'y': random.uniform(-5.0, 5.0)};
-                self.mouse_pos = {};
-                self.smooth = 0.4; # value between 0 and 1
-
-                circle = self.canvas.add_circle(x, y, self.r, {'fill':'#000'});
-                ui.bind_event(circle, ui.EVENTS.MOUSE_PRESS, self.controller, 'mouse_press', self.inports["ball_ui"]);
-                ui.bind_event(circle, ui.EVENTS.MOUSE_MOVE, self.controller, 'mouse_move', self.inports['ball_ui']);
-                ui.bind_event(circle, ui.EVENTS.MOUSE_RELEASE, self.controller, 'mouse_release', self.inports['ball_ui']);
-                self.element = circle;
-                ]]>
-            </body>
-        </constructor>
-        <destructor>
-            <body>
-                <![CDATA[
-                self.canvas.remove_element(self.element);
-                ]]>
-            </body>
-        </destructor>
-        <scxml initial="main_behaviour">
-            <state id="main_behaviour" initial="initializing">
-                <state id="initializing">
-                    <transition event="set_association_name" target="../bouncing">
-                        <parameter name="association_name" type="str" />
-                        <script>
-                            <![CDATA[
-                            self.association_name = association_name
-                            ]]>                            
-                        </script>
-                    </transition>
-                </state>
-                <state id="bouncing">
-                    <transition after="(20 - self.getSimulatedTime() % 20) / 1000.0" target=".">
-                        <script>
-                            <![CDATA[
-                            pos = self.element.get_position();    
-                            if pos.x-self.r <= 0 or pos.x+self.r >= self.canvas.get_width():
-                                self.vel['x'] = -self.vel['x'];
-                            if pos.y-self.r <= 0 or pos.y+self.r >= self.canvas.get_height():
-                                self.vel['y'] = -self.vel['y'];
-                            self.element.move(self.vel['x'], self.vel['y']);
-                            ]]>                            
-                        </script>
-                    </transition>
-                    <transition port="ball_ui" event="mouse_press" target="../selected" cond="button == ui.MOUSE_BUTTONS.LEFT">
-                        <parameter name="x" />
-                        <parameter name="y" />
-                        <parameter name="button" />
-                        <script>
-                            <![CDATA[
-                            self.element.set_color("#ff0");
-                            ]]>                            
-                        </script>
-                    </transition>
-                </state>
-                <state id="dragging">
-                    <transition port="ball_ui" event="mouse_move" target=".">
-                        <parameter name="x" />
-                        <parameter name="y" />
-                        <parameter name="button" />
-                        <script>
-                            <![CDATA[
-                            dx = x - self.mouse_pos['x'];
-                            dy = y - self.mouse_pos['y'];
-
-                            self.element.move(dx, dy);
-
-                            # keep ball within boundaries
-                            pos = self.element.get_position();
-                            if pos.x-self.r <= 0 :
-                                pos.x = self.r + 1;
-                            elif pos.x+self.r >= self.canvas.width :
-                                pos.x = self.canvas.width-self.r-1;
-                            if pos.y-self.r <= 0 :
-                                pos.y = self.r + 1;
-                            elif pos.y+self.r >= self.canvas.height :
-                                pos.y = self.canvas.height-self.r-1;
-                            self.element.set_position(pos.x, pos.y);
-                            self.mouse_pos = {'x':x, 'y':y};
-                            self.vel = {
-                                'x': (1-self.smooth)*dx + self.smooth*self.vel['x'],
-                                'y': (1-self.smooth)*dy + self.smooth*self.vel['y']
-                            };
-                            ]]>
-                        </script>
-                    </transition>
-                    <transition port="ball_ui" event="mouse_release" target="../bouncing">
-                        <parameter name="x" />
-                        <parameter name="y" />
-                        <script>
-                            <![CDATA[
-                            self.element.set_color("#f00");
-                            ]]>                            
-                        </script>
-                    </transition>
-                </state>
-                <state id='selected'>
-                    <transition port="ball_ui" event="mouse_press" target="../dragging" cond="button == ui.MOUSE_BUTTONS.LEFT">
-                        <parameter name="x" />
-                        <parameter name="y" />
-                        <parameter name="button" />
-                        <script>
-                            <![CDATA[
-                            self.mouse_pos = {'x':x, 'y':y};
-                            ]]>
-                        </script>
-                    </transition>
-                    <transition event="delete_self" target='../../deleted'>                    
-                        <raise event="delete_ball" scope="narrow" target="'parent'">
-                            <parameter expr='self.association_name' />
-                        </raise>
-                    </transition>
-                </state>
-            </state>
-            <state id='deleted' />
-        </scxml>
-    </class>
-</diagram>

+ 28 - 42
examples/BouncingBalls/sccd.xml

@@ -1,15 +1,13 @@
 <?xml version="1.1" ?>
 <?xml version="1.1" ?>
-<diagram author="Simon Van Mierlo+Raphael Mannadiar" name="Bouncing_Balls_Python_Version">
+<diagram author="Sam Pieters" name="Bouncing_Balls_DEVS_Version">
     <description>
     <description>
         Tkinter frame with bouncing balls in it.
         Tkinter frame with bouncing balls in it.
     </description>
     </description>
     <top>
     <top>
         from sccd.runtime.libs import ui_v2 as ui
         from sccd.runtime.libs import ui_v2 as ui
-        from sccd.runtime.libs.utils import utils
         import random
         import random
 
 
-        CANVAS_WIDTH = 800
-        CANVAS_HEIGHT = 550
+        CANVAS_DIMS = (800, 550)
     </top>
     </top>
     <inport name="ui"/>
     <inport name="ui"/>
     <outport name="ui"/>
     <outport name="ui"/>
@@ -101,38 +99,34 @@
                     <transition event="set_association_name" target="../creating_window">
                     <transition event="set_association_name" target="../creating_window">
                         <parameter name="association_name" type="str" />
                         <parameter name="association_name" type="str" />
                         <script>
                         <script>
-                            <![CDATA[
                             self.association_name = association_name
                             self.association_name = association_name
-                            ]]>
                         </script>
                         </script>
                     </transition>
                     </transition>
                 </state>
                 </state>
                 <state id="creating_window">
                 <state id="creating_window">
                     <onentry>
                     <onentry>
                         <raise port="ui" event="create_window">
                         <raise port="ui" event="create_window">
-                            <parameter expr="800"/><!-- width -->
-                            <parameter expr="600"/><!-- height -->
-                            <parameter expr='"BouncingBalls"'/><!-- title -->
+                            <parameter expr="800"/>                     <!-- width -->
+                            <parameter expr="600"/>                     <!-- height -->
+                            <parameter expr='"BouncingBalls"'/>         <!-- title -->
                             <parameter expr="self.inports['field_ui']"/><!-- inport for response -->
                             <parameter expr="self.inports['field_ui']"/><!-- inport for response -->
                         </raise>
                         </raise>
                     </onentry>
                     </onentry>
                     <transition event="window_created" target="../creating_canvas">
                     <transition event="window_created" target="../creating_canvas">
                         <parameter name="window_id" type="int" />
                         <parameter name="window_id" type="int" />
                         <script>
                         <script>
-                            <![CDATA[
                             self.window_id = window_id
                             self.window_id = window_id
-                            ]]>
                         </script>
                         </script>
                         <raise port="ui" event="bind_event">
                         <raise port="ui" event="bind_event">
-                            <parameter expr="window_id"/><!-- widget_id -->
-                            <parameter expr="ui.EVENTS.WINDOW_CLOSE"/><!-- tk_event -->
-                            <parameter expr="'window_close'"/><!-- sccd_event_name -->
+                            <parameter expr="window_id"/>               <!-- widget_id -->
+                            <parameter expr="ui.EVENTS.WINDOW_CLOSE"/>  <!-- tk_event -->
+                            <parameter expr="'window_close'"/>          <!-- sccd_event_name -->
                             <parameter expr="self.inports['field_ui']"/><!-- inport for response -->
                             <parameter expr="self.inports['field_ui']"/><!-- inport for response -->
                         </raise>
                         </raise>
                         <raise port="ui" event="bind_event">
                         <raise port="ui" event="bind_event">
-                            <parameter expr="window_id"/><!-- widget_id -->
-                            <parameter expr="ui.EVENTS.KEY_PRESS"/><!-- tk_event -->
-                            <parameter expr="'key_press'"/><!-- sccd_event_name -->
+                            <parameter expr="window_id"/>               <!-- widget_id -->
+                            <parameter expr="ui.EVENTS.KEY_PRESS"/>     <!-- tk_event -->
+                            <parameter expr="'key_press'"/>             <!-- sccd_event_name -->
                             <parameter expr="self.inports['field_ui']"/><!-- inport for response -->
                             <parameter expr="self.inports['field_ui']"/><!-- inport for response -->
                         </raise>
                         </raise>
                     </transition>
                     </transition>
@@ -140,31 +134,29 @@
                 <state id="creating_canvas">
                 <state id="creating_canvas">
                     <onentry>
                     <onentry>
                         <raise port="ui" event="create_canvas">
                         <raise port="ui" event="create_canvas">
-                            <parameter expr="self.window_id"/><!-- window_id -->
-                            <parameter expr="CANVAS_WIDTH"/><!-- width -->
-                            <parameter expr="CANVAS_HEIGHT"/><!-- height -->
-                            <parameter expr="{'background':'#eee'}"/><!-- style -->
+                            <parameter expr="self.window_id"/>          <!-- window_id -->
+                            <parameter expr="CANVAS_DIMS[0]"/>          <!-- width -->
+                            <parameter expr="CANVAS_DIMS[1]"/>          <!-- height -->
+                            <parameter expr="{'background':'#eee'}"/>   <!-- style -->
                             <parameter expr="self.inports['field_ui']"/><!-- inport for response -->
                             <parameter expr="self.inports['field_ui']"/><!-- inport for response -->
                         </raise>
                         </raise>
                     </onentry>
                     </onentry>
                     <transition event="canvas_created" target="../creating_button">
                     <transition event="canvas_created" target="../creating_button">
                         <parameter name="canvas_id" type="int"/>
                         <parameter name="canvas_id" type="int"/>
                         <script>
                         <script>
-                            <![CDATA[
                             self.canvas_id = canvas_id
                             self.canvas_id = canvas_id
-                            ]]>
                         </script>
                         </script>
                         <raise port="ui" event="bind_event">
                         <raise port="ui" event="bind_event">
-                            <parameter expr="canvas_id"/><!-- widget_id -->
-                            <parameter expr="ui.EVENTS.MOUSE_RIGHT_CLICK"/><!-- tk_event -->
-                            <parameter expr="'right_click'"/><!-- sccd_event_name -->
-                            <parameter expr="self.inports['field_ui']"/><!-- inport for response -->
+                            <parameter expr="canvas_id"/>                   <!-- widget_id -->
+                            <parameter expr="ui.EVENTS.MOUSE_RIGHT_CLICK"/> <!-- tk_event -->
+                            <parameter expr="'right_click'"/>               <!-- sccd_event_name -->
+                            <parameter expr="self.inports['field_ui']"/>    <!-- inport for response -->
                         </raise>
                         </raise>
                         <raise port="ui" event="bind_event">
                         <raise port="ui" event="bind_event">
-                            <parameter expr="canvas_id"/><!-- widget_id -->
-                            <parameter expr="ui.EVENTS.MOUSE_MOVE"/><!-- tk_event -->
-                            <parameter expr="'mouse_move'"/><!-- sccd_event_name -->
-                            <parameter expr="self.inports['field_ui']"/><!-- inport for response -->
+                            <parameter expr="canvas_id"/>                   <!-- widget_id -->
+                            <parameter expr="ui.EVENTS.MOUSE_MOVE"/>        <!-- tk_event -->
+                            <parameter expr="'mouse_move'"/>                <!-- sccd_event_name -->
+                            <parameter expr="self.inports['field_ui']"/>    <!-- inport for response -->
                         </raise>
                         </raise>
                         <raise port="ui" event="bind_event">
                         <raise port="ui" event="bind_event">
                             <parameter expr="canvas_id"/><!-- widget_id -->
                             <parameter expr="canvas_id"/><!-- widget_id -->
@@ -336,13 +328,11 @@
             <parameter name="x" />
             <parameter name="x" />
             <parameter name="y" />
             <parameter name="y" />
             <body>
             <body>
-                <![CDATA[
                 self.canvas_id = canvas_id;
                 self.canvas_id = canvas_id;
                 self.r = 20.0;
                 self.r = 20.0;
                 self.vel = {'x': random.uniform(-5.0, 5.0), 'y': random.uniform(-5.0, 5.0)};
                 self.vel = {'x': random.uniform(-5.0, 5.0), 'y': random.uniform(-5.0, 5.0)};
                 self.pos = {'x': x, 'y': y};
                 self.pos = {'x': x, 'y': y};
                 self.smooth = 0.6; # value between 0 and 1
                 self.smooth = 0.6; # value between 0 and 1
-                ]]>
             </body>
             </body>
         </constructor>
         </constructor>
         <destructor>
         <destructor>
@@ -404,9 +394,9 @@
                         <script>
                         <script>
                             <![CDATA[
                             <![CDATA[
                             # Invert velocity when colliding with canvas border:
                             # Invert velocity when colliding with canvas border:
-                            if self.pos['x']-self.r <= 0 or self.pos['x']+self.r >= CANVAS_WIDTH:
+                            if self.pos['x']-self.r <= 0 or self.pos['x']+self.r >= CANVAS_DIMS[0]:
                                 self.vel['x'] = -self.vel['x'];
                                 self.vel['x'] = -self.vel['x'];
-                            if self.pos['y']-self.r <= 0 or self.pos['y']+self.r >= CANVAS_HEIGHT:
+                            if self.pos['y']-self.r <= 0 or self.pos['y']+self.r >= CANVAS_DIMS[1]:
                                 self.vel['y'] = -self.vel['y'];
                                 self.vel['y'] = -self.vel['y'];
                             ]]>
                             ]]>
                         </script>
                         </script>
@@ -438,10 +428,9 @@
                         <parameter name="y" />
                         <parameter name="y" />
                         <parameter name="button" />
                         <parameter name="button" />
                         <script>
                         <script>
-                            <![CDATA[
                             # Always keep ball within canvas:
                             # Always keep ball within canvas:
-                            x = min(max(0+self.r, x), CANVAS_WIDTH-self.r)
-                            y = min(max(0+self.r, y), CANVAS_HEIGHT-self.r)
+                            x = min(max(0+self.r, x), CANVAS_DIMS[0]-self.r)
+                            y = min(max(0+self.r, y), CANVAS_DIMS[1]-self.r)
 
 
                             dx = x - self.pos['x']
                             dx = x - self.pos['x']
                             dy = y - self.pos['y']
                             dy = y - self.pos['y']
@@ -450,9 +439,8 @@
                                 'x': (1-self.smooth)*dx + self.smooth*self.vel['x'],
                                 'x': (1-self.smooth)*dx + self.smooth*self.vel['x'],
                                 'y': (1-self.smooth)*dy + self.smooth*self.vel['y']
                                 'y': (1-self.smooth)*dy + self.smooth*self.vel['y']
                             }
                             }
-
+                            
                             self.pos = {'x': x, 'y': y}
                             self.pos = {'x': x, 'y': y}
-                            ]]>
                         </script>
                         </script>
                         <raise port="ui" event="set_element_pos">
                         <raise port="ui" event="set_element_pos">
                             <parameter expr="self.canvas_id"/>
                             <parameter expr="self.canvas_id"/>
@@ -477,9 +465,7 @@
                         <parameter name="y" />
                         <parameter name="y" />
                         <parameter name="button" />
                         <parameter name="button" />
                         <script>
                         <script>
-                            <![CDATA[
                             self.mouse_pos = {'x':x, 'y':y};
                             self.mouse_pos = {'x':x, 'y':y};
-                            ]]>
                         </script>
                         </script>
                     </transition>
                     </transition>
                     <transition event="delete_self" target='../../deleted'>                    
                     <transition event="delete_self" target='../../deleted'>                    

+ 0 - 24
examples/FixedTrafficLight/PyDEVS/runner.py

@@ -1,24 +0,0 @@
-from pypdevs.simulator import Simulator
-import target as target
-
-from tkinter import *
-from sccd.runtime.libs.DEVui import ui
-
-
-
-model = target.Controller(name="controller")
-refs = {"ui": model.ui}
-ui.window = Tk()
-ui.window.withdraw()
-
-sim = Simulator(model)
-sim.setRealTime(True)
-sim.setRealTimeInputFile(None)
-sim.setRealTimePorts(refs)
-sim.setVerbose(None)
-sim.setRealTimePlatformTk(ui.window)
-
-ui.simulator = sim
-
-sim.simulate()
-ui.window.mainloop()

+ 0 - 40
examples/FixedTrafficLight/Python/runner.py

@@ -1,40 +0,0 @@
-import tkinter as tk
-import target as target
-from sccd.runtime.libs.ui import ui
-from sccd.runtime.statecharts_core import Event
-from sccd.runtime.tkinter_eventloop import *
-
-if __name__ == '__main__':
-	ui.window = tk.Tk()
-
-	controller = target.Controller(TkEventLoop(ui.window))
-	controller.start()
-	ui.window.mainloop()
-
-
-import tkinter as tk
-import target as target
-from sccd.runtime.libs.ui_v2 import UI
-from sccd.runtime.tkinter_eventloop import TkEventLoop
-
-class OutputListener:
-	def __init__(self, ui):
-		self.ui = ui
-
-	def add(self, event):
-		if event.port == "ui":
-			method = getattr(self.ui, event.name)
-			method(*event.parameters)
-
-if __name__ == '__main__':
-	tkroot = tk.Tk()
-	tkroot.withdraw()
-	controller = target.Controller(TkEventLoop(tkroot))
-	ui = UI(tkroot, controller)
-	controller.addMyOwnOutputListener(OutputListener(ui))
-
-	controller.setVerbose(None)
-	
-	controller.start()
-	tkroot.mainloop()
-	

+ 0 - 113
examples/FixedTrafficLight/sccd.xml

@@ -1,113 +0,0 @@
-<?xml version="1.0" ?>
-<diagram author="Sam Pieters" name="Timer (Eventloop Version)">
-    <top>
-        from sccd.runtime.libs.ui import ui
-        import time
-
-        CANVAS_WIDTH = 350
-        CANVAS_HEIGHT = 300
-    </top>
-    
-    <inport name="ui" />    
-    <class name="MainApp" default="true">
-        <attribute name="window_id" />
-        <attribute name="canvas_id" />
-        <attribute name="clock_id" />
-        <attribute name="actual_clock_id" />
-        <attribute name="button_id" />
-        <attribute name="starting_time" />
-        <inport name="field_ui"/>
-        <scxml initial="creating_window">
-            <state id="creating_window">
-                <onentry>
-                    <raise port="ui" event="create_window">
-                        <parameter expr="CANVAS_WIDTH"/><!-- width -->
-                        <parameter expr="CANVAS_HEIGHT"/><!-- height -->
-                        <parameter expr='"Fixed Timer"'/><!-- title -->
-                        <parameter expr="self.inports['field_ui']"/><!-- inport for response -->
-                    </raise>
-                </onentry>
-                <transition event="window_created" target="../creating_canvas">
-                    <parameter name="window_id" type="int" />
-                    <script>
-                        <![CDATA[
-                        self.window_id = window_id
-                        self.starting_time = time.time()
-                        ]]>
-                    </script>
-                    <raise port="ui" event="bind_event">
-                        <parameter expr="window_id"/><!-- widget_id -->
-                        <parameter expr="ui.EVENTS.WINDOW_CLOSE"/><!-- tk_event -->
-                        <parameter expr="'window_close'"/><!-- sccd_event_name -->
-                        <parameter expr="self.inports['field_ui']"/><!-- inport for response -->
-                    </raise>
-                    <raise port="ui" event="bind_event">
-                        <parameter expr="window_id"/><!-- widget_id -->
-                        <parameter expr="ui.EVENTS.KEY_PRESS"/><!-- tk_event -->
-                        <parameter expr="'key_press'"/><!-- sccd_event_name -->
-                        <parameter expr="self.inports['field_ui']"/><!-- inport for response -->
-                    </raise>
-                </transition>
-            </state>
-            <state id="creating_canvas">
-                <onentry>
-                    <raise port="ui" event="create_canvas">
-                        <parameter expr="self.window_id"/><!-- window_id -->
-                        <parameter expr="CANVAS_WIDTH"/><!-- width -->
-                        <parameter expr="CANVAS_HEIGHT - 200"/><!-- height -->
-                        <parameter expr="{'background':'#222222'}"/><!-- style -->
-                        <parameter expr="self.inports['field_ui']"/><!-- inport for response -->
-                    </raise>
-                </onentry>
-                <transition event="canvas_created" target="../creating_clock_text">
-                    <parameter name="canvas_id" type="int"/>
-                    <script>
-                        <![CDATA[
-                        self.canvas_id = canvas_id
-                        ]]>
-                    </script>
-                    <raise scope="narrow" event="set_association_name" target="association_name">
-                        <parameter expr="association_name" />
-                    </raise>
-                </transition>
-            </state>
-            <state id="running">
-            </state>
-        </scxml>
-    </class>
-
-    <class name="Elevator">
-        <attribute name="canvas_id" />
-        <atrribute name="circle_id" />
-        <attribute name="pos" />
-        <inport name="elevator_ui"/>
-        <relationships>
-            <association name="parent" class="MainApp" min="1" max="1" />
-        </relationships>
-        <scxml initial="root">
-            <state id="root" initial="waiting">
-                <state id="waiting">
-                    <transition event="set_association_name" target="../creating_elevator">
-                        <parameter name="association_name" type="str" />
-                        <script>
-                            self.association_name = association_name
-                        </script>
-                    </transition>
-                </state>
-                <state id="creating_elevator">
-                    <onentry>
-                        <raise port="ui" event="create_rectangle">
-                            canvas_id, x, y, r, style, res_port
-                            <parameter expr="self.canvas_id"/><!-- canvas_id -->
-                            <parameter expr="self.pos['x']"/><!-- x -->
-                            <parameter expr="self.pos['y']"/><!-- y -->
-                            <parameter expr="self.r"/><!-- r -->
-                            <parameter expr="{'fill':'#000'}"/><!-- style -->
-                            <parameter expr="self.inports['ball_ui']"/><!-- inport for response -->
-                        </raise>
-                    </onentry>
-                </state>
-            </state>
-        </scxml>
-    </class>
-</diagram>

examples/FixedTimerEventloop/PyDEVS/runner.py → examples/TimerEventloop/PyDEVS/runner.py


examples/FixedTimerEventloop/PyDEVS/target.py → examples/TimerEventloop/PyDEVS/target.py


examples/FixedTimerEventloop/Python/runner.py → examples/TimerEventloop/Python/runner.py


+ 1 - 0
examples/FixedTimerEventloop/Python/target.py

@@ -225,4 +225,5 @@ class Controller(EventLoopControllerBase):
         if behind_schedule_callback == None: behind_schedule_callback = None
         if behind_schedule_callback == None: behind_schedule_callback = None
         EventLoopControllerBase.__init__(self, ObjectManager(self), event_loop_callbacks, finished_callback, behind_schedule_callback)
         EventLoopControllerBase.__init__(self, ObjectManager(self), event_loop_callbacks, finished_callback, behind_schedule_callback)
         self.addInputPort("ui")
         self.addInputPort("ui")
+        self.addOutputPort("ui")
         self.object_manager.createInstance("MainApp", [])
         self.object_manager.createInstance("MainApp", [])

+ 22 - 23
examples/FixedTimerEventloop/sccd.xml

@@ -4,8 +4,7 @@
         from sccd.runtime.libs.ui import ui
         from sccd.runtime.libs.ui import ui
         import time
         import time
 
 
-        CANVAS_WIDTH = 350
-        CANVAS_HEIGHT = 300
+        CANVAS_DIMS = (350, 300)
     </top>
     </top>
     
     
     <inport name="ui" />
     <inport name="ui" />
@@ -22,10 +21,10 @@
             <state id="creating_window">
             <state id="creating_window">
                 <onentry>
                 <onentry>
                     <raise port="ui" event="create_window">
                     <raise port="ui" event="create_window">
-                        <parameter expr="CANVAS_WIDTH"/><!-- width -->
-                        <parameter expr="CANVAS_HEIGHT"/><!-- height -->
-                        <parameter expr='"Fixed Timer"'/><!-- title -->
-                        <parameter expr="self.inports['field_ui']"/><!-- inport for response -->
+                        <parameter expr="CANVAS_DIMS[0]"/>
+                        <parameter expr="CANVAS_DIMS[1]"/>
+                        <parameter expr='"Fixed Timer"'/>
+                        <parameter expr="self.inports['field_ui']"/>
                     </raise>
                     </raise>
                 </onentry>
                 </onentry>
                 <transition event="window_created" target="../creating_canvas">
                 <transition event="window_created" target="../creating_canvas">
@@ -37,27 +36,27 @@
                         ]]>
                         ]]>
                     </script>
                     </script>
                     <raise port="ui" event="bind_event">
                     <raise port="ui" event="bind_event">
-                        <parameter expr="window_id"/><!-- widget_id -->
-                        <parameter expr="ui.EVENTS.WINDOW_CLOSE"/><!-- tk_event -->
-                        <parameter expr="'window_close'"/><!-- sccd_event_name -->
-                        <parameter expr="self.inports['field_ui']"/><!-- inport for response -->
+                        <parameter expr="window_id"/>
+                        <parameter expr="ui.EVENTS.WINDOW_CLOSE"/>
+                        <parameter expr="'window_close'"/>
+                        <parameter expr="self.inports['field_ui']"/>
                     </raise>
                     </raise>
                     <raise port="ui" event="bind_event">
                     <raise port="ui" event="bind_event">
-                        <parameter expr="window_id"/><!-- widget_id -->
-                        <parameter expr="ui.EVENTS.KEY_PRESS"/><!-- tk_event -->
-                        <parameter expr="'key_press'"/><!-- sccd_event_name -->
-                        <parameter expr="self.inports['field_ui']"/><!-- inport for response -->
+                        <parameter expr="window_id"/>
+                        <parameter expr="ui.EVENTS.KEY_PRESS"/>
+                        <parameter expr="'key_press'"/>
+                        <parameter expr="self.inports['field_ui']"/>
                     </raise>
                     </raise>
                 </transition>
                 </transition>
             </state>
             </state>
             <state id="creating_canvas">
             <state id="creating_canvas">
                 <onentry>
                 <onentry>
                     <raise port="ui" event="create_canvas">
                     <raise port="ui" event="create_canvas">
-                        <parameter expr="self.window_id"/><!-- window_id -->
-                        <parameter expr="CANVAS_WIDTH"/><!-- width -->
-                        <parameter expr="CANVAS_HEIGHT - 200"/><!-- height -->
-                        <parameter expr="{'background':'#222222'}"/><!-- style -->
-                        <parameter expr="self.inports['field_ui']"/><!-- inport for response -->
+                        <parameter expr="self.window_id"/>
+                        <parameter expr="CANVAS_DIMS[0]"/>
+                        <parameter expr="CANVAS_DIMS[1] - 200"/>
+                        <parameter expr="{'background':'#222222'}"/>
+                        <parameter expr="self.inports['field_ui']"/>
                     </raise>
                     </raise>
                 </onentry>
                 </onentry>
                 <transition event="canvas_created" target="../creating_clock_text">
                 <transition event="canvas_created" target="../creating_clock_text">
@@ -119,10 +118,10 @@
                         self.button_id = button_id
                         self.button_id = button_id
                     </script> 
                     </script> 
                     <raise port="ui" event="bind_event">
                     <raise port="ui" event="bind_event">
-                        <parameter expr="button_id"/><!-- widget_id -->
-                        <parameter expr="ui.EVENTS.MOUSE_CLICK"/><!-- tk_event -->
-                        <parameter expr='"mouse_click"'/><!-- sccd_event_name -->
-                        <parameter expr="self.inports['field_ui']"/><!-- inport for response -->
+                        <parameter expr="button_id"/>
+                        <parameter expr="ui.EVENTS.MOUSE_CLICK"/>
+                        <parameter expr='"mouse_click"'/>
+                        <parameter expr="self.inports['field_ui']"/>
                     </raise>
                     </raise>
                 </transition>
                 </transition>
             </state>
             </state>

examples/FixedTimerThread/PyDEVS/runner.py → examples/TimerThread/PyDEVS/runner.py


examples/FixedTimerThread/PyDEVS/target.py → examples/TimerThread/PyDEVS/target.py


examples/FixedTimerThread/Python/runner.py → examples/TimerThread/Python/runner.py


examples/FixedTimerThread/Python/target.py → examples/TimerThread/Python/target.py


examples/FixedTimerThread/sccd.xml → examples/TimerThread/sccd.xml


+ 26 - 17
examples/TrafficLight/PyDEVS/runner.py

@@ -1,24 +1,33 @@
-from pypdevs.simulator import Simulator
-import target as target
+import tkinter as tk
+import examples.TrafficLight.PyDEVS.target as target
+from sccd.runtime.libs.ui_v2 import UI
+from sccd.runtime.DEVS_loop import DEVSSimulator
 
 
-from tkinter import *
-from sccd.runtime.libs.DEVui import ui
 
 
+class OutputListener:
+	def __init__(self, ui):
+		self.ui = ui
 
 
+	def add(self, events):
+		for event in events:
+			if event.port == "ui":
+				method = getattr(self.ui, event.name)
+				method(*event.parameters)
 
 
-model = target.Controller(name="controller")
-refs = {"ui": model.ui}
-ui.window = Tk()
-ui.window.withdraw()
+if __name__ == '__main__':
+	model = target.Controller(name="controller")
+	refs = {"ui": model.in_ui, "field_ui": model.atomic0.field_ui}
 
 
-sim = Simulator(model)
-sim.setRealTime(True)
-sim.setRealTimeInputFile(None)
-sim.setRealTimePorts(refs)
-sim.setVerbose(None)
-sim.setRealTimePlatformTk(ui.window)
+	tkroot = tk.Tk()
+	tkroot.withdraw()
+	sim = DEVSSimulator(model, refs)
 
 
-ui.simulator = sim
+	sim.setVerbose()
+	sim.setRealTimePlatformTk(tkroot)
 
 
-sim.simulate()
-ui.window.mainloop()
+	ui = UI(tkroot, sim)
+
+	listener = OutputListener(ui)
+	sim.setListenPorts(model.out_ui, listener.add)
+	sim.simulate()
+	tkroot.mainloop()

+ 241 - 357
examples/TrafficLight/PyDEVS/target.py

@@ -1,24 +1,24 @@
 """
 """
 Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration) and Sam Pieters (DEVS)
 Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration) and Sam Pieters (DEVS)
 
 
-Model author: Raphael Mannadiar
-Model name:   Traffic_Light_Python_Version
-
+Model author: Sam Pieters
+Model name:   TrafficLight
+Model description:
+Tkinter frame with Traffic light in a single statechart.
 """
 """
 
 
 from sccd.runtime.DEVS_statecharts_core import *
 from sccd.runtime.DEVS_statecharts_core import *
-from pypdevs.DEVS import *
-from pypdevs.infinity import *
-from pypdevs.simulator import *
-from sccd.runtime.libs.ui import ui
+from sccd.runtime.libs import ui_v2 as ui
+CANVAS_DIMS = (100, 350)
+CANVAS_WIDTH = 100
+CANVAS_HEIGHT = 350
 
 
-# package "Traffic_Light_Python_Version"
+# package "TrafficLight"
 
 
 class MainAppInstance(RuntimeClassBase):
 class MainAppInstance(RuntimeClassBase):
     def __init__(self, atomdevs):
     def __init__(self, atomdevs):
         RuntimeClassBase.__init__(self, atomdevs)
         RuntimeClassBase.__init__(self, atomdevs)
         self.associations = {}
         self.associations = {}
-        self.associations["trafficlight"] = Association("TrafficLight", 0, -1)
         
         
         self.semantics.big_step_maximality = StatechartSemantics.TakeMany
         self.semantics.big_step_maximality = StatechartSemantics.TakeMany
         self.semantics.internal_event_lifeline = StatechartSemantics.Queue
         self.semantics.internal_event_lifeline = StatechartSemantics.Queue
@@ -29,15 +29,25 @@ class MainAppInstance(RuntimeClassBase):
         # build Statechart structure
         # build Statechart structure
         self.build_statechart_structure()
         self.build_statechart_structure()
         
         
+        # user defined attributes
+        self.window_id = None
+        self.canvas_id = None
+        self.green_id = None
+        self.yellow_id = None
+        self.red_id = None
+        self.police_button_id = None
+        
         # call user defined constructor
         # call user defined constructor
         MainAppInstance.user_defined_constructor(self)
         MainAppInstance.user_defined_constructor(self)
+        port_name = Ports.addInputPort("<narrow_cast>", self)
+        atomdevs.addInPort(port_name)
+        port_name = Ports.addInputPort("field_ui", self)
+        atomdevs.addInPort(port_name)
+        atomdevs.port_mappings[port_name] = atomdevs.next_instance
+        self.inports["field_ui"] = port_name
     
     
     def user_defined_constructor(self):
     def user_defined_constructor(self):
-        self.canvas   = ui.append_canvas(ui.window,100,310,{'background':'#eee'});
-        police_button = ui.append_button(ui.window, 'Police interrupt');
-        quit_button   = ui.append_button(ui.window, 'Quit');
-        ui.bind_event(police_button.element, ui.EVENTS.MOUSE_CLICK, self.controller, 'police_interrupt_clicked');
-        ui.bind_event(quit_button.element, ui.EVENTS.MOUSE_CLICK, self.controller, 'quit_clicked');
+        pass
     
     
     def user_defined_destructor(self):
     def user_defined_destructor(self):
         pass
         pass
@@ -49,265 +59,146 @@ class MainAppInstance(RuntimeClassBase):
         # state <root>
         # state <root>
         self.states[""] = State(0, "", self)
         self.states[""] = State(0, "", self)
         
         
-        # state /initializing
-        self.states["/initializing"] = State(1, "/initializing", self)
+        # state /creating_window
+        self.states["/creating_window"] = State(1, "/creating_window", self)
+        self.states["/creating_window"].setEnter(self._creating_window_enter)
         
         
-        # state /creating
-        self.states["/creating"] = State(2, "/creating", self)
+        # state /creating_canvas
+        self.states["/creating_canvas"] = State(2, "/creating_canvas", self)
+        self.states["/creating_canvas"].setEnter(self._creating_canvas_enter)
         
         
-        # state /initialized
-        self.states["/initialized"] = State(3, "/initialized", self)
+        # state /creating_trafficlight
+        self.states["/creating_trafficlight"] = State(3, "/creating_trafficlight", self)
         
         
-        # add children
-        self.states[""].addChild(self.states["/initializing"])
-        self.states[""].addChild(self.states["/creating"])
-        self.states[""].addChild(self.states["/initialized"])
-        self.states[""].fixTree()
-        self.states[""].default_state = self.states["/initializing"]
+        # state /creating_trafficlight/creating_greenlight
+        self.states["/creating_trafficlight/creating_greenlight"] = State(4, "/creating_trafficlight/creating_greenlight", self)
+        self.states["/creating_trafficlight/creating_greenlight"].setEnter(self._creating_trafficlight_creating_greenlight_enter)
         
         
-        # transition /initializing
-        _initializing_0 = Transition(self, self.states["/initializing"], [self.states["/creating"]])
-        _initializing_0.setAction(self._initializing_0_exec)
-        _initializing_0.setTrigger(None)
-        self.states["/initializing"].addTransition(_initializing_0)
+        # state /creating_trafficlight/creating_yellowlight
+        self.states["/creating_trafficlight/creating_yellowlight"] = State(5, "/creating_trafficlight/creating_yellowlight", self)
+        self.states["/creating_trafficlight/creating_yellowlight"].setEnter(self._creating_trafficlight_creating_yellowlight_enter)
         
         
-        # transition /creating
-        _creating_0 = Transition(self, self.states["/creating"], [self.states["/initialized"]])
-        _creating_0.setAction(self._creating_0_exec)
-        _creating_0.setTrigger(Event("instance_created", None))
-        self.states["/creating"].addTransition(_creating_0)
-    
-    def _initializing_0_exec(self, parameters):
-        self.big_step.outputEventOM(Event("create_instance", None, [self, "trafficlight", "TrafficLight", self.canvas]))
-    
-    def _creating_0_exec(self, parameters):
-        association_name = parameters[0]
-        self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
-        self.big_step.outputEventOM(Event("narrow_cast", None, [self, association_name, Event("set_association_name", None, [association_name])]))
-    
-    def initializeStatechart(self):
-        # enter default state
-        self.default_targets = self.states["/initializing"].getEffectiveTargetStates()
-        RuntimeClassBase.initializeStatechart(self)
-
-class MainApp(AtomicDEVS, ObjectManagerBase):
-    def __init__(self, name):
-        AtomicDEVS.__init__(self, name)
-        ObjectManagerBase.__init__(self)
-        self.elapsed = 0
-        self.obj_manager_in = self.addInPort("obj_manager_in")
-        self.obj_manager_out = self.addOutPort("obj_manager_out")
-        self.input = self.addInPort("input")
-        self.outputs = {}
-        self.outputs["trafficlight"] = self.addOutPort("trafficlight")
-        self.obj_manager_in = self.addInPort("obj_manager_in")
-        self.input = self.addInPort("input")
-        self.instances.add(MainAppInstance(self))
-
-        self.name = "MainApp"
-    
-    def extTransition(self, inputs):
-        self.simulated_time = (self.simulated_time + self.elapsed)
-        all_inputs = []
-        if self.obj_manager_in in inputs:
-            all_inputs.extend(inputs[self.obj_manager_in])
-        if self.input in inputs:
-            all_inputs.extend(inputs[self.input])
-        for input in all_inputs:
-            if isinstance(input, str):
-                tem = eval(input)
-                self.addInput(tem)
-            if input[3].name == "create_instance":
-                self.instances.add(MainAppInstance(self))
-                ev = Event("instance_created", None, parameters=[f"{input[0]}[{len(self.instances)-1}]"])
-                self.to_send.append(("MainApp", TODO, input[2], ev))
-            elif input[3].name == "start_instance":
-                instance = list(self.instances)[input[2]]
-                instance.start()
-                ev = Event("instance_started", None, parameters=[])
-                self.to_send.append((input[0], input[1], input[2], ev))
-            elif input[3].name == "delete_instance":
-                ev = Event("instance_deleted", None, parameters=[TODO])
-                self.to_send.append((TODO, TODO, TODO, ev))
-            elif input[3].name == "associate_instance":
-                ev = Event("instance_associated", None, parameters=[TODO])
-                self.to_send.append((TODO, TODO, TODO, ev))
-            elif input[3].name == "disassociate_instance":
-                ev = Event("instance_disassociated", None, parameters=[TODO])
-                self.to_send.append((TODO, TODO, TODO, ev))
-            elif input[3].name == "instance_created":
-                instance = list(self.instances)[input[2]]
-                instance.addEvent(input[3])
-                instance.associations['fields'].instances[0] = input[3].parameters[0]
-            elif input[3].name == "instance_started":
-                instance = list(self.instances)[input[2]]
-                instance.addEvent(input[3])
-            elif input[3].name == "instance_deleted":
-                instance = list(self.instances)[input[2]]
-                instance.addEvent(input[3])
-            elif input[3].name == "instance_associated":
-                instance = list(self.instances)[input[2]]
-                instance.addEvent(input[3])
-            elif input[3].name == "instance_disassociated":
-                instance = list(self.instances)[input[2]]
-                instance.addEvent(input[3])
-            elif input[3].name == "set_association_name":
-                ev = input[3]
-                self.addInput(ev, force_internal=True)
-        return self.instances
-    
-    def intTransition(self):
-        self.to_send = []
-        self.handleInput()
-        self.stepAll()
-        return self.instances
-    
-    def outputFnc(self):
-        to_dict = {}
-        for sending in self.to_send:
-            if sending[0] == None:
-                if self.obj_manager_out in to_dict:
-                    to_dict[self.obj_manager_out].append(sending)
-                else:
-                    to_dict[self.obj_manager_out] = [sending]
-            else:
-                the_port = None
-                for port in self.OPorts:
-                    if port.name == sending[0]:
-                        the_port = port
-                if the_port in to_dict:
-                    to_dict[the_port].append(sending)
-                else:
-                    to_dict[the_port] = [sending]
-        return to_dict
-    
-    def timeAdvance(self):
-        if not (len(self.to_send) == 0):
-            return 0
-        return self.getEarliestEventTime()
-
-class TrafficLightInstance(RuntimeClassBase):
-    def __init__(self, atomdevs, canvas):
-        RuntimeClassBase.__init__(self, atomdevs)
-        self.associations = {}
+        # state /creating_trafficlight/creating_redlight
+        self.states["/creating_trafficlight/creating_redlight"] = State(6, "/creating_trafficlight/creating_redlight", self)
+        self.states["/creating_trafficlight/creating_redlight"].setEnter(self._creating_trafficlight_creating_redlight_enter)
         
         
-        self.semantics.big_step_maximality = StatechartSemantics.TakeMany
-        self.semantics.internal_event_lifeline = StatechartSemantics.Queue
-        self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
-        self.semantics.priority = StatechartSemantics.SourceParent
-        self.semantics.concurrency = StatechartSemantics.Single
+        # state /creating_interrupt_button
+        self.states["/creating_interrupt_button"] = State(7, "/creating_interrupt_button", self)
+        self.states["/creating_interrupt_button"].setEnter(self._creating_interrupt_button_enter)
         
         
-        # build Statechart structure
-        self.build_statechart_structure()
-        
-        # call user defined constructor
-        TrafficLightInstance.user_defined_constructor(self, canvas)
-    
-    def user_defined_constructor(self, canvas):
-        size        = 100;
-        offset      = size+5;
-        self.RED    = 0;
-        self.YELLOW = 1;
-        self.GREEN  = 2;
-        self.colors = ['#f00','#ff0','#0f0']
-        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'})];
-    
-    def user_defined_destructor(self):
-        pass
-    
-    
-    # user defined method
-    def clear(self):
-        self.lights[self.RED].set_color('#000');
-        self.lights[self.YELLOW].set_color('#000');
-        self.lights[self.GREEN].set_color('#000');
-    
-    
-    # user defined method
-    def setGreen(self):
-        self.clear();
-        self.lights[self.GREEN].set_color(self.colors[self.GREEN]);
-    
-    
-    # user defined method
-    def setYellow(self):
-        self.clear();
-        self.lights[self.YELLOW].set_color(self.colors[self.YELLOW]);
-    
-    
-    # user defined method
-    def setRed(self):
-        self.clear();
-        self.lights[self.RED].set_color(self.colors[self.RED]);
-    
-    
-    # builds Statechart structure
-    def build_statechart_structure(self):
-        
-        # state <root>
-        self.states[""] = State(0, "", self)
+        # state /creating_quit_button
+        self.states["/creating_quit_button"] = State(8, "/creating_quit_button", self)
+        self.states["/creating_quit_button"].setEnter(self._creating_quit_button_enter)
         
         
         # state /on
         # state /on
-        self.states["/on"] = State(1, "/on", self)
+        self.states["/on"] = State(9, "/on", self)
         
         
         # state /on/normal
         # state /on/normal
-        self.states["/on/normal"] = State(2, "/on/normal", self)
+        self.states["/on/normal"] = State(10, "/on/normal", self)
         
         
         # state /on/normal/red
         # state /on/normal/red
-        self.states["/on/normal/red"] = State(3, "/on/normal/red", self)
+        self.states["/on/normal/red"] = State(11, "/on/normal/red", self)
         self.states["/on/normal/red"].setEnter(self._on_normal_red_enter)
         self.states["/on/normal/red"].setEnter(self._on_normal_red_enter)
         self.states["/on/normal/red"].setExit(self._on_normal_red_exit)
         self.states["/on/normal/red"].setExit(self._on_normal_red_exit)
         
         
         # state /on/normal/green
         # state /on/normal/green
-        self.states["/on/normal/green"] = State(4, "/on/normal/green", self)
+        self.states["/on/normal/green"] = State(12, "/on/normal/green", self)
         self.states["/on/normal/green"].setEnter(self._on_normal_green_enter)
         self.states["/on/normal/green"].setEnter(self._on_normal_green_enter)
         self.states["/on/normal/green"].setExit(self._on_normal_green_exit)
         self.states["/on/normal/green"].setExit(self._on_normal_green_exit)
         
         
         # state /on/normal/yellow
         # state /on/normal/yellow
-        self.states["/on/normal/yellow"] = State(5, "/on/normal/yellow", self)
+        self.states["/on/normal/yellow"] = State(13, "/on/normal/yellow", self)
         self.states["/on/normal/yellow"].setEnter(self._on_normal_yellow_enter)
         self.states["/on/normal/yellow"].setEnter(self._on_normal_yellow_enter)
         self.states["/on/normal/yellow"].setExit(self._on_normal_yellow_exit)
         self.states["/on/normal/yellow"].setExit(self._on_normal_yellow_exit)
         
         
-        # state /on/normal/history
-        self.states["/on/normal/history"] = ShallowHistoryState(6, "/on/normal/history", self)
-        
         # state /on/interrupted
         # state /on/interrupted
-        self.states["/on/interrupted"] = State(7, "/on/interrupted", self)
+        self.states["/on/interrupted"] = State(14, "/on/interrupted", self)
         
         
         # state /on/interrupted/yellow
         # state /on/interrupted/yellow
-        self.states["/on/interrupted/yellow"] = State(8, "/on/interrupted/yellow", self)
+        self.states["/on/interrupted/yellow"] = State(15, "/on/interrupted/yellow", self)
         self.states["/on/interrupted/yellow"].setEnter(self._on_interrupted_yellow_enter)
         self.states["/on/interrupted/yellow"].setEnter(self._on_interrupted_yellow_enter)
         self.states["/on/interrupted/yellow"].setExit(self._on_interrupted_yellow_exit)
         self.states["/on/interrupted/yellow"].setExit(self._on_interrupted_yellow_exit)
         
         
         # state /on/interrupted/black
         # state /on/interrupted/black
-        self.states["/on/interrupted/black"] = State(9, "/on/interrupted/black", self)
+        self.states["/on/interrupted/black"] = State(16, "/on/interrupted/black", self)
         self.states["/on/interrupted/black"].setEnter(self._on_interrupted_black_enter)
         self.states["/on/interrupted/black"].setEnter(self._on_interrupted_black_enter)
         self.states["/on/interrupted/black"].setExit(self._on_interrupted_black_exit)
         self.states["/on/interrupted/black"].setExit(self._on_interrupted_black_exit)
         
         
         # state /off
         # state /off
-        self.states["/off"] = State(10, "/off", self)
+        self.states["/off"] = State(17, "/off", self)
         self.states["/off"].setEnter(self._off_enter)
         self.states["/off"].setEnter(self._off_enter)
         
         
+        # state /deleted
+        self.states["/deleted"] = State(18, "/deleted", self)
+        
         # add children
         # add children
+        self.states[""].addChild(self.states["/creating_window"])
+        self.states[""].addChild(self.states["/creating_canvas"])
+        self.states[""].addChild(self.states["/creating_trafficlight"])
+        self.states[""].addChild(self.states["/creating_interrupt_button"])
+        self.states[""].addChild(self.states["/creating_quit_button"])
         self.states[""].addChild(self.states["/on"])
         self.states[""].addChild(self.states["/on"])
         self.states[""].addChild(self.states["/off"])
         self.states[""].addChild(self.states["/off"])
+        self.states[""].addChild(self.states["/deleted"])
+        self.states["/creating_trafficlight"].addChild(self.states["/creating_trafficlight/creating_greenlight"])
+        self.states["/creating_trafficlight"].addChild(self.states["/creating_trafficlight/creating_yellowlight"])
+        self.states["/creating_trafficlight"].addChild(self.states["/creating_trafficlight/creating_redlight"])
         self.states["/on"].addChild(self.states["/on/normal"])
         self.states["/on"].addChild(self.states["/on/normal"])
         self.states["/on"].addChild(self.states["/on/interrupted"])
         self.states["/on"].addChild(self.states["/on/interrupted"])
         self.states["/on/normal"].addChild(self.states["/on/normal/red"])
         self.states["/on/normal"].addChild(self.states["/on/normal/red"])
         self.states["/on/normal"].addChild(self.states["/on/normal/green"])
         self.states["/on/normal"].addChild(self.states["/on/normal/green"])
         self.states["/on/normal"].addChild(self.states["/on/normal/yellow"])
         self.states["/on/normal"].addChild(self.states["/on/normal/yellow"])
-        self.states["/on/normal"].addChild(self.states["/on/normal/history"])
         self.states["/on/interrupted"].addChild(self.states["/on/interrupted/yellow"])
         self.states["/on/interrupted"].addChild(self.states["/on/interrupted/yellow"])
         self.states["/on/interrupted"].addChild(self.states["/on/interrupted/black"])
         self.states["/on/interrupted"].addChild(self.states["/on/interrupted/black"])
         self.states[""].fixTree()
         self.states[""].fixTree()
-        self.states[""].default_state = self.states["/on"]
+        self.states[""].default_state = self.states["/creating_window"]
+        self.states["/creating_trafficlight"].default_state = self.states["/creating_trafficlight/creating_greenlight"]
         self.states["/on"].default_state = self.states["/on/normal"]
         self.states["/on"].default_state = self.states["/on/normal"]
         self.states["/on/normal"].default_state = self.states["/on/normal/red"]
         self.states["/on/normal"].default_state = self.states["/on/normal/red"]
         self.states["/on/interrupted"].default_state = self.states["/on/interrupted/yellow"]
         self.states["/on/interrupted"].default_state = self.states["/on/interrupted/yellow"]
         
         
+        # transition /creating_window
+        _creating_window_0 = Transition(self, self.states["/creating_window"], [self.states["/creating_canvas"]])
+        _creating_window_0.setAction(self._creating_window_0_exec)
+        _creating_window_0.setTrigger(Event("window_created", None))
+        self.states["/creating_window"].addTransition(_creating_window_0)
+        
+        # transition /creating_canvas
+        _creating_canvas_0 = Transition(self, self.states["/creating_canvas"], [self.states["/creating_trafficlight"]])
+        _creating_canvas_0.setAction(self._creating_canvas_0_exec)
+        _creating_canvas_0.setTrigger(Event("canvas_created", None))
+        self.states["/creating_canvas"].addTransition(_creating_canvas_0)
+        
+        # transition /creating_trafficlight/creating_greenlight
+        _creating_trafficlight_creating_greenlight_0 = Transition(self, self.states["/creating_trafficlight/creating_greenlight"], [self.states["/creating_trafficlight/creating_yellowlight"]])
+        _creating_trafficlight_creating_greenlight_0.setAction(self._creating_trafficlight_creating_greenlight_0_exec)
+        _creating_trafficlight_creating_greenlight_0.setTrigger(Event("rectangle_created", None))
+        self.states["/creating_trafficlight/creating_greenlight"].addTransition(_creating_trafficlight_creating_greenlight_0)
+        
+        # transition /creating_trafficlight/creating_yellowlight
+        _creating_trafficlight_creating_yellowlight_0 = Transition(self, self.states["/creating_trafficlight/creating_yellowlight"], [self.states["/creating_trafficlight/creating_redlight"]])
+        _creating_trafficlight_creating_yellowlight_0.setAction(self._creating_trafficlight_creating_yellowlight_0_exec)
+        _creating_trafficlight_creating_yellowlight_0.setTrigger(Event("rectangle_created", None))
+        self.states["/creating_trafficlight/creating_yellowlight"].addTransition(_creating_trafficlight_creating_yellowlight_0)
+        
+        # transition /creating_trafficlight/creating_redlight
+        _creating_trafficlight_creating_redlight_0 = Transition(self, self.states["/creating_trafficlight/creating_redlight"], [self.states["/creating_interrupt_button"]])
+        _creating_trafficlight_creating_redlight_0.setAction(self._creating_trafficlight_creating_redlight_0_exec)
+        _creating_trafficlight_creating_redlight_0.setTrigger(Event("rectangle_created", None))
+        self.states["/creating_trafficlight/creating_redlight"].addTransition(_creating_trafficlight_creating_redlight_0)
+        
+        # transition /creating_interrupt_button
+        _creating_interrupt_button_0 = Transition(self, self.states["/creating_interrupt_button"], [self.states["/creating_quit_button"]])
+        _creating_interrupt_button_0.setAction(self._creating_interrupt_button_0_exec)
+        _creating_interrupt_button_0.setTrigger(Event("button_created", None))
+        self.states["/creating_interrupt_button"].addTransition(_creating_interrupt_button_0)
+        
+        # transition /creating_quit_button
+        _creating_quit_button_0 = Transition(self, self.states["/creating_quit_button"], [self.states["/on"]])
+        _creating_quit_button_0.setAction(self._creating_quit_button_0_exec)
+        _creating_quit_button_0.setTrigger(Event("button_created", None))
+        self.states["/creating_quit_button"].addTransition(_creating_quit_button_0)
+        
         # transition /on/normal/red
         # transition /on/normal/red
         _on_normal_red_0 = Transition(self, self.states["/on/normal/red"], [self.states["/on/normal/green"]])
         _on_normal_red_0 = Transition(self, self.states["/on/normal/red"], [self.states["/on/normal/green"]])
         _on_normal_red_0.setTrigger(Event("_0after"))
         _on_normal_red_0.setTrigger(Event("_0after"))
@@ -333,199 +224,192 @@ class TrafficLightInstance(RuntimeClassBase):
         _on_interrupted_black_0.setTrigger(Event("_4after"))
         _on_interrupted_black_0.setTrigger(Event("_4after"))
         self.states["/on/interrupted/black"].addTransition(_on_interrupted_black_0)
         self.states["/on/interrupted/black"].addTransition(_on_interrupted_black_0)
         
         
-        # transition /on
-        _on_0 = Transition(self, self.states["/on"], [self.states["/off"]])
-        _on_0.setTrigger(Event("quit_clicked", self.getInPortName("ui")))
-        self.states["/on"].addTransition(_on_0)
-        
         # transition /on/normal
         # transition /on/normal
-        _on_normal_0 = Transition(self, self.states["/on/normal"], [self.states["/on/interrupted"]])
-        _on_normal_0.setTrigger(Event("police_interrupt_clicked", self.getInPortName("ui")))
+        _on_normal_0 = Transition(self, self.states["/on/normal"], [self.states["/deleted"]])
+        _on_normal_0.setAction(self._on_normal_0_exec)
+        _on_normal_0.setTrigger(Event("window_close", self.getInPortName("field_ui")))
         self.states["/on/normal"].addTransition(_on_normal_0)
         self.states["/on/normal"].addTransition(_on_normal_0)
+        _on_normal_1 = Transition(self, self.states["/on/normal"], [self.states["/off"]])
+        _on_normal_1.setTrigger(Event("quit_clicked", self.getInPortName("field_ui")))
+        _on_normal_1.setGuard(self._on_normal_1_guard)
+        self.states["/on/normal"].addTransition(_on_normal_1)
+        _on_normal_2 = Transition(self, self.states["/on/normal"], [self.states["/on/interrupted"]])
+        _on_normal_2.setAction(self._on_normal_2_exec)
+        _on_normal_2.setTrigger(Event("interrupt_clicked", self.getInPortName("field_ui")))
+        _on_normal_2.setGuard(self._on_normal_2_guard)
+        self.states["/on/normal"].addTransition(_on_normal_2)
         
         
         # transition /on/interrupted
         # transition /on/interrupted
-        _on_interrupted_0 = Transition(self, self.states["/on/interrupted"], [self.states["/on/normal/history"]])
-        _on_interrupted_0.setTrigger(Event("police_interrupt_clicked", self.getInPortName("ui")))
+        _on_interrupted_0 = Transition(self, self.states["/on/interrupted"], [self.states["/on/normal"]])
+        _on_interrupted_0.setTrigger(Event("interrupt_clicked", self.getInPortName("field_ui")))
+        _on_interrupted_0.setGuard(self._on_interrupted_0_guard)
         self.states["/on/interrupted"].addTransition(_on_interrupted_0)
         self.states["/on/interrupted"].addTransition(_on_interrupted_0)
     
     
+    def _creating_window_enter(self):
+        self.big_step.outputEvent(Event("create_window", self.getOutPortName("ui"), [CANVAS_DIMS[0], CANVAS_DIMS[1], "Fixed Traffic Light", self.inports['field_ui']]))
+    
+    def _creating_canvas_enter(self):
+        self.big_step.outputEvent(Event("create_canvas", self.getOutPortName("ui"), [self.window_id, CANVAS_DIMS[0], CANVAS_DIMS[1] - 100, {'background':'#222222'}, self.inports['field_ui']]))
+    
+    def _creating_trafficlight_creating_greenlight_enter(self):
+        self.big_step.outputEvent(Event("create_rectangle", self.getOutPortName("ui"), [self.canvas_id, 50, 50, 50, 50, {'fill':'#000'}, self.inports['field_ui']]))
+    
+    def _creating_trafficlight_creating_yellowlight_enter(self):
+        self.big_step.outputEvent(Event("create_rectangle", self.getOutPortName("ui"), [self.canvas_id, 50, 110, 50, 50, {'fill':'#000'}, self.inports['field_ui']]))
+    
+    def _creating_trafficlight_creating_redlight_enter(self):
+        self.big_step.outputEvent(Event("create_rectangle", self.getOutPortName("ui"), [self.canvas_id, 50, 170, 50, 50, {'fill':'#000'}, self.inports['field_ui']]))
+    
+    def _creating_interrupt_button_enter(self):
+        self.big_step.outputEvent(Event("create_button", self.getOutPortName("ui"), [self.window_id, 'Police Interrupt', self.inports['field_ui']]))
+    
+    def _creating_quit_button_enter(self):
+        self.big_step.outputEvent(Event("create_button", self.getOutPortName("ui"), [self.window_id, 'Quit', self.inports['field_ui']]))
+    
     def _on_normal_red_enter(self):
     def _on_normal_red_enter(self):
-        self.setRed();
+        self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.yellow_id, 'black']))
+        self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.red_id, 'red']))
         self.addTimer(0, 3)
         self.addTimer(0, 3)
     
     
     def _on_normal_red_exit(self):
     def _on_normal_red_exit(self):
         self.removeTimer(0)
         self.removeTimer(0)
     
     
     def _on_normal_green_enter(self):
     def _on_normal_green_enter(self):
-        self.setGreen();
+        self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.red_id, 'black']))
+        self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.green_id, 'green']))
         self.addTimer(1, 2)
         self.addTimer(1, 2)
     
     
     def _on_normal_green_exit(self):
     def _on_normal_green_exit(self):
         self.removeTimer(1)
         self.removeTimer(1)
     
     
     def _on_normal_yellow_enter(self):
     def _on_normal_yellow_enter(self):
-        self.setYellow();
+        self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.green_id, 'black']))
+        self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.yellow_id, 'yellow']))
         self.addTimer(2, 1)
         self.addTimer(2, 1)
     
     
     def _on_normal_yellow_exit(self):
     def _on_normal_yellow_exit(self):
         self.removeTimer(2)
         self.removeTimer(2)
     
     
     def _on_interrupted_yellow_enter(self):
     def _on_interrupted_yellow_enter(self):
-        self.setYellow();
+        self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.yellow_id, 'yellow']))
         self.addTimer(3, .5)
         self.addTimer(3, .5)
     
     
     def _on_interrupted_yellow_exit(self):
     def _on_interrupted_yellow_exit(self):
         self.removeTimer(3)
         self.removeTimer(3)
     
     
     def _on_interrupted_black_enter(self):
     def _on_interrupted_black_enter(self):
-        self.clear();
+        self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.yellow_id, 'black']))
         self.addTimer(4, .5)
         self.addTimer(4, .5)
     
     
     def _on_interrupted_black_exit(self):
     def _on_interrupted_black_exit(self):
         self.removeTimer(4)
         self.removeTimer(4)
     
     
     def _off_enter(self):
     def _off_enter(self):
-        self.clear();
+        self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.green_id, 'black']))
+        self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.yellow_id, 'black']))
+        self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.red_id, 'black']))
+    
+    def _on_normal_0_exec(self, parameters):
+        self.big_step.outputEvent(Event("destroy_all", self.getOutPortName("ui"), []))
+    
+    def _on_normal_1_guard(self, parameters):
+        x = parameters[0]
+        y = parameters[1]
+        button = parameters[2]
+        return button == ui.MOUSE_BUTTONS.LEFT
+    
+    def _on_normal_2_exec(self, parameters):
+        x = parameters[0]
+        y = parameters[1]
+        button = parameters[2]
+        self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.green_id, 'black']))
+        self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.yellow_id, 'black']))
+        self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.red_id, 'black']))
+    
+    def _on_normal_2_guard(self, parameters):
+        x = parameters[0]
+        y = parameters[1]
+        button = parameters[2]
+        return button == ui.MOUSE_BUTTONS.LEFT
+    
+    def _on_interrupted_0_guard(self, parameters):
+        x = parameters[0]
+        y = parameters[1]
+        button = parameters[2]
+        return button == ui.MOUSE_BUTTONS.LEFT
+    
+    def _creating_window_0_exec(self, parameters):
+        window_id = parameters[0]
+        self.window_id = window_id
+        self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [window_id, ui.EVENTS.WINDOW_CLOSE, 'window_close', self.inports['field_ui']]))
+    
+    def _creating_canvas_0_exec(self, parameters):
+        canvas_id = parameters[0]
+        self.canvas_id = canvas_id
+    
+    def _creating_trafficlight_creating_greenlight_0_exec(self, parameters):
+        canvas_id = parameters[0]
+        green_id = parameters[1]
+        self.green_id = green_id
+    
+    def _creating_trafficlight_creating_yellowlight_0_exec(self, parameters):
+        canvas_id = parameters[0]
+        yellow_id = parameters[1]
+        self.yellow_id = yellow_id
+    
+    def _creating_trafficlight_creating_redlight_0_exec(self, parameters):
+        canvas_id = parameters[0]
+        red_id = parameters[1]
+        self.red_id = red_id
+    
+    def _creating_interrupt_button_0_exec(self, parameters):
+        button_id = parameters[0]
+        self.police_button_id = button_id
+        self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [button_id, ui.EVENTS.MOUSE_CLICK, "interrupt_clicked", self.inports['field_ui']]))
+    
+    def _creating_quit_button_0_exec(self, parameters):
+        button_id = parameters[0]
+        self.quit_button_id = button_id
+        self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [button_id, ui.EVENTS.MOUSE_CLICK, "quit_clicked", self.inports['field_ui']]))
     
     
     def initializeStatechart(self):
     def initializeStatechart(self):
         # enter default state
         # enter default state
-        self.default_targets = self.states["/on"].getEffectiveTargetStates()
+        self.default_targets = self.states["/creating_window"].getEffectiveTargetStates()
         RuntimeClassBase.initializeStatechart(self)
         RuntimeClassBase.initializeStatechart(self)
 
 
-class TrafficLight(AtomicDEVS, ObjectManagerBase):
+class MainApp(ObjectManagerBase):
     def __init__(self, name):
     def __init__(self, name):
-        AtomicDEVS.__init__(self, name)
-        ObjectManagerBase.__init__(self)
-        self.elapsed = 0
-        self.obj_manager_in = self.addInPort("obj_manager_in")
-        self.obj_manager_out = self.addOutPort("obj_manager_out")
-        self.input = self.addInPort("input")
-        self.outputs = {}
-        self.obj_manager_in = self.addInPort("obj_manager_in")
+        ObjectManagerBase.__init__(self, name)
         self.input = self.addInPort("input")
         self.input = self.addInPort("input")
-    
-    def extTransition(self, inputs):
-        self.simulated_time = (self.simulated_time + self.elapsed)
-        all_inputs = []
-        if self.obj_manager_in in inputs:
-            all_inputs.extend(inputs[self.obj_manager_in])
-        if self.input in inputs:
-            all_inputs.extend(inputs[self.input])
-        for input in all_inputs:
-            if isinstance(input, str):
-                tem = eval(input)
-                self.addInput(tem)
-            if input[3].name == "create_instance":
-                self.instances.add(TrafficLightInstance(self))
-                ev = Event("instance_created", None, parameters=[f"{input[0]}[{len(self.instances)-1}]"])
-                self.to_send.append(("TrafficLight", TODO, input[2], ev))
-            elif input[3].name == "start_instance":
-                instance = list(self.instances)[input[2]]
-                instance.start()
-                ev = Event("instance_started", None, parameters=[TODO])
-                self.to_send.append((input[0], input[1], input[2], ev))
-            elif input[3].name == "delete_instance":
-                ev = Event("instance_deleted", None, parameters=[TODO])
-                self.to_send.append((TODO, TODO, TODO, ev))
-            elif input[3].name == "associate_instance":
-                ev = Event("instance_associated", None, parameters=[TODO])
-                self.to_send.append((TODO, TODO, TODO, ev))
-            elif input[3].name == "disassociate_instance":
-                ev = Event("instance_disassociated", None, parameters=[TODO])
-                self.to_send.append((TODO, TODO, TODO, ev))
-            elif input[3].name == "instance_created":
-                instance = list(self.instances)[input[2]]
-                instance.addEvent(input[3])
-                instance.associations['fields'].instances[0] = input[3].parameters[0]
-            elif input[3].name == "instance_started":
-                instance = list(self.instances)[input[2]]
-                instance.addEvent(input[3])
-            elif input[3].name == "instance_deleted":
-                instance = list(self.instances)[input[2]]
-                instance.addEvent(input[3])
-            elif input[3].name == "instance_associated":
-                instance = list(self.instances)[input[2]]
-                instance.addEvent(input[3])
-            elif input[3].name == "instance_disassociated":
-                instance = list(self.instances)[input[2]]
-                instance.addEvent(input[3])
-            elif input[3].name == "set_association_name":
-                ev = input[3]
-                self.addInput(ev, force_internal=True)
-        return self.instances
-    
-    def intTransition(self):
-        self.to_send = []
-        self.handleInput()
-        self.stepAll()
-        return self.instances
-    
-    def outputFnc(self):
-        to_dict = {}
-        for sending in self.to_send:
-            if sending[0] == None:
-                if self.obj_manager_out in to_dict:
-                    to_dict[self.obj_manager_out].append(sending)
-                else:
-                    to_dict[self.obj_manager_out] = [sending]
-            else:
-                the_port = None
-                for port in self.OPorts:
-                    if port.name == sending[0]:
-                        the_port = port
-                if the_port in to_dict:
-                    to_dict[the_port].append(sending)
-                else:
-                    to_dict[the_port] = [sending]
-        return to_dict
-    
-    def timeAdvance(self):
-        if not (len(self.to_send) == 0):
-            return 0
-        return self.getEarliestEventTime()
+        self.output = self.addOutPort("ui")
+        self.field_ui = self.addInPort("field_ui")
+        self.instances[self.next_instance] = MainAppInstance(self)
+        self.next_instance = self.next_instance + 1
+    
+    def constructObject(self, parameters):
+        new_instance = MainAppInstance(self)
+        return new_instance
 
 
 class ObjectManagerState:
 class ObjectManagerState:
     def __init__(self):
     def __init__(self):
-        self.to_send = [(None, "MainApp", 0, Event("start_instance", None, None))]
+        self.to_send = [("MainApp", "MainApp", Event("start_instance", None, ["MainApp[0]"], 0))]
 
 
-class ObjectManager(AtomicDEVS):
+class ObjectManager(TheObjectManager):
     def __init__(self, name):
     def __init__(self, name):
-        AtomicDEVS.__init__(self, name)
+        TheObjectManager.__init__(self, name)
         self.State = ObjectManagerState()
         self.State = ObjectManagerState()
         self.input = self.addInPort("input")
         self.input = self.addInPort("input")
-        self.output = {}
         self.output["MainApp"] = self.addOutPort()
         self.output["MainApp"] = self.addOutPort()
-        self.output["TrafficLight"] = self.addOutPort()
-    
-    def extTransition(self, inputs):
-        all_inputs = inputs[self.input]
-        for input in all_inputs:
-            self.State.to_send.append(input)
-        return self.State
-    
-    def intTransition(self):
-        self.State.to_send = []
-        return self.State
-    
-    def outputFnc(self):
-        out_dict = {}
-        for (source, target, id, message) in self.State.to_send:
-            out_dict[self.output[target]] = [(source, target, id, message)]
-        return out_dict
-    
-    def timeAdvance(self):
-        if self.State.to_send:
-            return 0
-        return INFINITY
 
 
 class Controller(CoupledDEVS):
 class Controller(CoupledDEVS):
     def __init__(self, name):
     def __init__(self, name):
         CoupledDEVS.__init__(self, name)
         CoupledDEVS.__init__(self, name)
-        self.ui = self.addInPort("ui")
+        self.in_ui = self.addInPort("ui")
+        Ports.addInputPort("ui")
+        self.out_ui = self.addOutPort("ui")
+        Ports.addOutputPort("ui")
         self.objectmanager = self.addSubModel(ObjectManager("ObjectManager"))
         self.objectmanager = self.addSubModel(ObjectManager("ObjectManager"))
         self.atomic0 = self.addSubModel(MainApp("MainApp"))
         self.atomic0 = self.addSubModel(MainApp("MainApp"))
-        self.atomic1 = self.addSubModel(TrafficLight("TrafficLight"))
         self.connectPorts(self.atomic0.obj_manager_out, self.objectmanager.input)
         self.connectPorts(self.atomic0.obj_manager_out, self.objectmanager.input)
         self.connectPorts(self.objectmanager.output["MainApp"], self.atomic0.obj_manager_in)
         self.connectPorts(self.objectmanager.output["MainApp"], self.atomic0.obj_manager_in)
-        self.connectPorts(self.atomic0.outputs["trafficlight"], self.atomic1.input)
-        self.connectPorts(self.atomic1.obj_manager_out, self.objectmanager.input)
-        self.connectPorts(self.objectmanager.output["TrafficLight"], self.atomic1.obj_manager_in)
+        self.connectPorts(self.atomic0.output, self.out_ui)

+ 20 - 6
examples/TrafficLight/Python/runner.py

@@ -1,12 +1,26 @@
 import tkinter as tk
 import tkinter as tk
 import target as target
 import target as target
-from sccd.runtime.libs.ui import ui
-from sccd.runtime.statecharts_core import Event
-from sccd.runtime.tkinter_eventloop import *
+from sccd.runtime.libs.ui_v2 import UI
+from sccd.runtime.tkinter_eventloop import TkEventLoop
+
+class OutputListener:
+	def __init__(self, ui):
+		self.ui = ui
+
+	def add(self, event):
+		if event.port == "ui":
+			method = getattr(self.ui, event.name)
+			method(*event.parameters)
 
 
 if __name__ == '__main__':
 if __name__ == '__main__':
-	ui.window = tk.Tk()
+	tkroot = tk.Tk()
+	tkroot.withdraw()
+	controller = target.Controller(TkEventLoop(tkroot))
+	ui = UI(tkroot, controller)
+	controller.addMyOwnOutputListener(OutputListener(ui))
 
 
-	controller = target.Controller(TkEventLoop(ui.window))
+	controller.setVerbose(None)
+	
 	controller.start()
 	controller.start()
-	ui.window.mainloop()
+	tkroot.mainloop()
+	

+ 219 - 141
examples/TrafficLight/Python/target.py

@@ -1,20 +1,25 @@
 """
 """
 Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
 Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
 
 
-Model author: Raphael Mannadiar
-Model name:   Traffic_Light_Python_Version
-
+Model author: Sam Pieters
+Model name:   TrafficLight
+Model description:
+Tkinter frame with Traffic light in a single statechart.
 """
 """
 
 
 from sccd.runtime.statecharts_core import *
 from sccd.runtime.statecharts_core import *
-from sccd.runtime.libs.ui import ui
+from sccd.runtime.libs import ui_v2 as ui
+CANVAS_DIMS = (100, 350)
+CANVAS_WIDTH = 100
+CANVAS_HEIGHT = 350
 
 
-# package "Traffic_Light_Python_Version"
+# package "TrafficLight"
 
 
 class MainApp(RuntimeClassBase):
 class MainApp(RuntimeClassBase):
     def __init__(self, controller):
     def __init__(self, controller):
         RuntimeClassBase.__init__(self, controller)
         RuntimeClassBase.__init__(self, controller)
         
         
+        self.inports["field_ui"] = controller.addInputPort("field_ui", self)
         
         
         self.semantics.big_step_maximality = StatechartSemantics.TakeMany
         self.semantics.big_step_maximality = StatechartSemantics.TakeMany
         self.semantics.internal_event_lifeline = StatechartSemantics.Queue
         self.semantics.internal_event_lifeline = StatechartSemantics.Queue
@@ -25,15 +30,19 @@ class MainApp(RuntimeClassBase):
         # build Statechart structure
         # build Statechart structure
         self.build_statechart_structure()
         self.build_statechart_structure()
         
         
+        # user defined attributes
+        self.window_id = None
+        self.canvas_id = None
+        self.green_id = None
+        self.yellow_id = None
+        self.red_id = None
+        self.police_button_id = None
+        
         # call user defined constructor
         # call user defined constructor
         MainApp.user_defined_constructor(self)
         MainApp.user_defined_constructor(self)
     
     
     def user_defined_constructor(self):
     def user_defined_constructor(self):
-        self.canvas   = ui.append_canvas(ui.window,100,310,{'background':'#eee'});
-        police_button = ui.append_button(ui.window, 'Police interrupt');
-        quit_button   = ui.append_button(ui.window, 'Quit');
-        ui.bind_event(police_button.element, ui.EVENTS.MOUSE_CLICK, self.controller, 'police_interrupt_clicked');
-        ui.bind_event(quit_button.element, ui.EVENTS.MOUSE_CLICK, self.controller, 'quit_clicked');
+        pass
     
     
     def user_defined_destructor(self):
     def user_defined_destructor(self):
         pass
         pass
@@ -45,169 +54,146 @@ class MainApp(RuntimeClassBase):
         # state <root>
         # state <root>
         self.states[""] = State(0, "", self)
         self.states[""] = State(0, "", self)
         
         
-        # state /initializing
-        self.states["/initializing"] = State(1, "/initializing", self)
+        # state /creating_window
+        self.states["/creating_window"] = State(1, "/creating_window", self)
+        self.states["/creating_window"].setEnter(self._creating_window_enter)
         
         
-        # state /creating
-        self.states["/creating"] = State(2, "/creating", self)
+        # state /creating_canvas
+        self.states["/creating_canvas"] = State(2, "/creating_canvas", self)
+        self.states["/creating_canvas"].setEnter(self._creating_canvas_enter)
         
         
-        # state /initialized
-        self.states["/initialized"] = State(3, "/initialized", self)
+        # state /creating_trafficlight
+        self.states["/creating_trafficlight"] = State(3, "/creating_trafficlight", self)
         
         
-        # add children
-        self.states[""].addChild(self.states["/initializing"])
-        self.states[""].addChild(self.states["/creating"])
-        self.states[""].addChild(self.states["/initialized"])
-        self.states[""].fixTree()
-        self.states[""].default_state = self.states["/initializing"]
+        # state /creating_trafficlight/creating_greenlight
+        self.states["/creating_trafficlight/creating_greenlight"] = State(4, "/creating_trafficlight/creating_greenlight", self)
+        self.states["/creating_trafficlight/creating_greenlight"].setEnter(self._creating_trafficlight_creating_greenlight_enter)
         
         
-        # transition /initializing
-        _initializing_0 = Transition(self, self.states["/initializing"], [self.states["/creating"]])
-        _initializing_0.setAction(self._initializing_0_exec)
-        _initializing_0.setTrigger(None)
-        self.states["/initializing"].addTransition(_initializing_0)
+        # state /creating_trafficlight/creating_yellowlight
+        self.states["/creating_trafficlight/creating_yellowlight"] = State(5, "/creating_trafficlight/creating_yellowlight", self)
+        self.states["/creating_trafficlight/creating_yellowlight"].setEnter(self._creating_trafficlight_creating_yellowlight_enter)
         
         
-        # transition /creating
-        _creating_0 = Transition(self, self.states["/creating"], [self.states["/initialized"]])
-        _creating_0.setAction(self._creating_0_exec)
-        _creating_0.setTrigger(Event("instance_created", None))
-        self.states["/creating"].addTransition(_creating_0)
-    
-    def _initializing_0_exec(self, parameters):
-        self.big_step.outputEventOM(Event("create_instance", None, [self, "trafficlight", "TrafficLight", self.canvas]))
-    
-    def _creating_0_exec(self, parameters):
-        association_name = parameters[0]
-        self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
-        self.big_step.outputEventOM(Event("narrow_cast", None, [self, association_name, Event("set_association_name", None, [association_name])]))
-    
-    def initializeStatechart(self):
-        # enter default state
-        self.default_targets = self.states["/initializing"].getEffectiveTargetStates()
-        RuntimeClassBase.initializeStatechart(self)
-
-class TrafficLight(RuntimeClassBase):
-    def __init__(self, controller, canvas):
-        RuntimeClassBase.__init__(self, controller)
+        # state /creating_trafficlight/creating_redlight
+        self.states["/creating_trafficlight/creating_redlight"] = State(6, "/creating_trafficlight/creating_redlight", self)
+        self.states["/creating_trafficlight/creating_redlight"].setEnter(self._creating_trafficlight_creating_redlight_enter)
         
         
+        # state /creating_interrupt_button
+        self.states["/creating_interrupt_button"] = State(7, "/creating_interrupt_button", self)
+        self.states["/creating_interrupt_button"].setEnter(self._creating_interrupt_button_enter)
         
         
-        self.semantics.big_step_maximality = StatechartSemantics.TakeMany
-        self.semantics.internal_event_lifeline = StatechartSemantics.Queue
-        self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
-        self.semantics.priority = StatechartSemantics.SourceParent
-        self.semantics.concurrency = StatechartSemantics.Single
-        
-        # build Statechart structure
-        self.build_statechart_structure()
-        
-        # call user defined constructor
-        TrafficLight.user_defined_constructor(self, canvas)
-    
-    def user_defined_constructor(self, canvas):
-        size        = 100;
-        offset      = size+5;
-        self.RED    = 0;
-        self.YELLOW = 1;
-        self.GREEN  = 2;
-        self.colors = ['#f00','#ff0','#0f0']
-        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'})];
-    
-    def user_defined_destructor(self):
-        pass
-    
-    
-    # user defined method
-    def clear(self):
-        self.lights[self.RED].set_color('#000');
-        self.lights[self.YELLOW].set_color('#000');
-        self.lights[self.GREEN].set_color('#000');
-    
-    
-    # user defined method
-    def setGreen(self):
-        self.clear();
-        self.lights[self.GREEN].set_color(self.colors[self.GREEN]);
-    
-    
-    # user defined method
-    def setYellow(self):
-        self.clear();
-        self.lights[self.YELLOW].set_color(self.colors[self.YELLOW]);
-    
-    
-    # user defined method
-    def setRed(self):
-        self.clear();
-        self.lights[self.RED].set_color(self.colors[self.RED]);
-    
-    
-    # builds Statechart structure
-    def build_statechart_structure(self):
-        
-        # state <root>
-        self.states[""] = State(0, "", self)
+        # state /creating_quit_button
+        self.states["/creating_quit_button"] = State(8, "/creating_quit_button", self)
+        self.states["/creating_quit_button"].setEnter(self._creating_quit_button_enter)
         
         
         # state /on
         # state /on
-        self.states["/on"] = State(1, "/on", self)
+        self.states["/on"] = State(9, "/on", self)
         
         
         # state /on/normal
         # state /on/normal
-        self.states["/on/normal"] = State(2, "/on/normal", self)
+        self.states["/on/normal"] = State(10, "/on/normal", self)
         
         
         # state /on/normal/red
         # state /on/normal/red
-        self.states["/on/normal/red"] = State(3, "/on/normal/red", self)
+        self.states["/on/normal/red"] = State(11, "/on/normal/red", self)
         self.states["/on/normal/red"].setEnter(self._on_normal_red_enter)
         self.states["/on/normal/red"].setEnter(self._on_normal_red_enter)
         self.states["/on/normal/red"].setExit(self._on_normal_red_exit)
         self.states["/on/normal/red"].setExit(self._on_normal_red_exit)
         
         
         # state /on/normal/green
         # state /on/normal/green
-        self.states["/on/normal/green"] = State(4, "/on/normal/green", self)
+        self.states["/on/normal/green"] = State(12, "/on/normal/green", self)
         self.states["/on/normal/green"].setEnter(self._on_normal_green_enter)
         self.states["/on/normal/green"].setEnter(self._on_normal_green_enter)
         self.states["/on/normal/green"].setExit(self._on_normal_green_exit)
         self.states["/on/normal/green"].setExit(self._on_normal_green_exit)
         
         
         # state /on/normal/yellow
         # state /on/normal/yellow
-        self.states["/on/normal/yellow"] = State(5, "/on/normal/yellow", self)
+        self.states["/on/normal/yellow"] = State(13, "/on/normal/yellow", self)
         self.states["/on/normal/yellow"].setEnter(self._on_normal_yellow_enter)
         self.states["/on/normal/yellow"].setEnter(self._on_normal_yellow_enter)
         self.states["/on/normal/yellow"].setExit(self._on_normal_yellow_exit)
         self.states["/on/normal/yellow"].setExit(self._on_normal_yellow_exit)
         
         
-        # state /on/normal/history
-        self.states["/on/normal/history"] = ShallowHistoryState(6, "/on/normal/history", self)
-        
         # state /on/interrupted
         # state /on/interrupted
-        self.states["/on/interrupted"] = State(7, "/on/interrupted", self)
+        self.states["/on/interrupted"] = State(14, "/on/interrupted", self)
         
         
         # state /on/interrupted/yellow
         # state /on/interrupted/yellow
-        self.states["/on/interrupted/yellow"] = State(8, "/on/interrupted/yellow", self)
+        self.states["/on/interrupted/yellow"] = State(15, "/on/interrupted/yellow", self)
         self.states["/on/interrupted/yellow"].setEnter(self._on_interrupted_yellow_enter)
         self.states["/on/interrupted/yellow"].setEnter(self._on_interrupted_yellow_enter)
         self.states["/on/interrupted/yellow"].setExit(self._on_interrupted_yellow_exit)
         self.states["/on/interrupted/yellow"].setExit(self._on_interrupted_yellow_exit)
         
         
         # state /on/interrupted/black
         # state /on/interrupted/black
-        self.states["/on/interrupted/black"] = State(9, "/on/interrupted/black", self)
+        self.states["/on/interrupted/black"] = State(16, "/on/interrupted/black", self)
         self.states["/on/interrupted/black"].setEnter(self._on_interrupted_black_enter)
         self.states["/on/interrupted/black"].setEnter(self._on_interrupted_black_enter)
         self.states["/on/interrupted/black"].setExit(self._on_interrupted_black_exit)
         self.states["/on/interrupted/black"].setExit(self._on_interrupted_black_exit)
         
         
         # state /off
         # state /off
-        self.states["/off"] = State(10, "/off", self)
+        self.states["/off"] = State(17, "/off", self)
         self.states["/off"].setEnter(self._off_enter)
         self.states["/off"].setEnter(self._off_enter)
         
         
+        # state /deleted
+        self.states["/deleted"] = State(18, "/deleted", self)
+        
         # add children
         # add children
+        self.states[""].addChild(self.states["/creating_window"])
+        self.states[""].addChild(self.states["/creating_canvas"])
+        self.states[""].addChild(self.states["/creating_trafficlight"])
+        self.states[""].addChild(self.states["/creating_interrupt_button"])
+        self.states[""].addChild(self.states["/creating_quit_button"])
         self.states[""].addChild(self.states["/on"])
         self.states[""].addChild(self.states["/on"])
         self.states[""].addChild(self.states["/off"])
         self.states[""].addChild(self.states["/off"])
+        self.states[""].addChild(self.states["/deleted"])
+        self.states["/creating_trafficlight"].addChild(self.states["/creating_trafficlight/creating_greenlight"])
+        self.states["/creating_trafficlight"].addChild(self.states["/creating_trafficlight/creating_yellowlight"])
+        self.states["/creating_trafficlight"].addChild(self.states["/creating_trafficlight/creating_redlight"])
         self.states["/on"].addChild(self.states["/on/normal"])
         self.states["/on"].addChild(self.states["/on/normal"])
         self.states["/on"].addChild(self.states["/on/interrupted"])
         self.states["/on"].addChild(self.states["/on/interrupted"])
         self.states["/on/normal"].addChild(self.states["/on/normal/red"])
         self.states["/on/normal"].addChild(self.states["/on/normal/red"])
         self.states["/on/normal"].addChild(self.states["/on/normal/green"])
         self.states["/on/normal"].addChild(self.states["/on/normal/green"])
         self.states["/on/normal"].addChild(self.states["/on/normal/yellow"])
         self.states["/on/normal"].addChild(self.states["/on/normal/yellow"])
-        self.states["/on/normal"].addChild(self.states["/on/normal/history"])
         self.states["/on/interrupted"].addChild(self.states["/on/interrupted/yellow"])
         self.states["/on/interrupted"].addChild(self.states["/on/interrupted/yellow"])
         self.states["/on/interrupted"].addChild(self.states["/on/interrupted/black"])
         self.states["/on/interrupted"].addChild(self.states["/on/interrupted/black"])
         self.states[""].fixTree()
         self.states[""].fixTree()
-        self.states[""].default_state = self.states["/on"]
+        self.states[""].default_state = self.states["/creating_window"]
+        self.states["/creating_trafficlight"].default_state = self.states["/creating_trafficlight/creating_greenlight"]
         self.states["/on"].default_state = self.states["/on/normal"]
         self.states["/on"].default_state = self.states["/on/normal"]
         self.states["/on/normal"].default_state = self.states["/on/normal/red"]
         self.states["/on/normal"].default_state = self.states["/on/normal/red"]
         self.states["/on/interrupted"].default_state = self.states["/on/interrupted/yellow"]
         self.states["/on/interrupted"].default_state = self.states["/on/interrupted/yellow"]
         
         
+        # transition /creating_window
+        _creating_window_0 = Transition(self, self.states["/creating_window"], [self.states["/creating_canvas"]])
+        _creating_window_0.setAction(self._creating_window_0_exec)
+        _creating_window_0.setTrigger(Event("window_created", None))
+        self.states["/creating_window"].addTransition(_creating_window_0)
+        
+        # transition /creating_canvas
+        _creating_canvas_0 = Transition(self, self.states["/creating_canvas"], [self.states["/creating_trafficlight"]])
+        _creating_canvas_0.setAction(self._creating_canvas_0_exec)
+        _creating_canvas_0.setTrigger(Event("canvas_created", None))
+        self.states["/creating_canvas"].addTransition(_creating_canvas_0)
+        
+        # transition /creating_trafficlight/creating_greenlight
+        _creating_trafficlight_creating_greenlight_0 = Transition(self, self.states["/creating_trafficlight/creating_greenlight"], [self.states["/creating_trafficlight/creating_yellowlight"]])
+        _creating_trafficlight_creating_greenlight_0.setAction(self._creating_trafficlight_creating_greenlight_0_exec)
+        _creating_trafficlight_creating_greenlight_0.setTrigger(Event("rectangle_created", None))
+        self.states["/creating_trafficlight/creating_greenlight"].addTransition(_creating_trafficlight_creating_greenlight_0)
+        
+        # transition /creating_trafficlight/creating_yellowlight
+        _creating_trafficlight_creating_yellowlight_0 = Transition(self, self.states["/creating_trafficlight/creating_yellowlight"], [self.states["/creating_trafficlight/creating_redlight"]])
+        _creating_trafficlight_creating_yellowlight_0.setAction(self._creating_trafficlight_creating_yellowlight_0_exec)
+        _creating_trafficlight_creating_yellowlight_0.setTrigger(Event("rectangle_created", None))
+        self.states["/creating_trafficlight/creating_yellowlight"].addTransition(_creating_trafficlight_creating_yellowlight_0)
+        
+        # transition /creating_trafficlight/creating_redlight
+        _creating_trafficlight_creating_redlight_0 = Transition(self, self.states["/creating_trafficlight/creating_redlight"], [self.states["/creating_interrupt_button"]])
+        _creating_trafficlight_creating_redlight_0.setAction(self._creating_trafficlight_creating_redlight_0_exec)
+        _creating_trafficlight_creating_redlight_0.setTrigger(Event("rectangle_created", None))
+        self.states["/creating_trafficlight/creating_redlight"].addTransition(_creating_trafficlight_creating_redlight_0)
+        
+        # transition /creating_interrupt_button
+        _creating_interrupt_button_0 = Transition(self, self.states["/creating_interrupt_button"], [self.states["/creating_quit_button"]])
+        _creating_interrupt_button_0.setAction(self._creating_interrupt_button_0_exec)
+        _creating_interrupt_button_0.setTrigger(Event("button_created", None))
+        self.states["/creating_interrupt_button"].addTransition(_creating_interrupt_button_0)
+        
+        # transition /creating_quit_button
+        _creating_quit_button_0 = Transition(self, self.states["/creating_quit_button"], [self.states["/on"]])
+        _creating_quit_button_0.setAction(self._creating_quit_button_0_exec)
+        _creating_quit_button_0.setTrigger(Event("button_created", None))
+        self.states["/creating_quit_button"].addTransition(_creating_quit_button_0)
+        
         # transition /on/normal/red
         # transition /on/normal/red
         _on_normal_red_0 = Transition(self, self.states["/on/normal/red"], [self.states["/on/normal/green"]])
         _on_normal_red_0 = Transition(self, self.states["/on/normal/red"], [self.states["/on/normal/green"]])
         _on_normal_red_0.setTrigger(Event("_0after"))
         _on_normal_red_0.setTrigger(Event("_0after"))
@@ -233,62 +219,157 @@ class TrafficLight(RuntimeClassBase):
         _on_interrupted_black_0.setTrigger(Event("_4after"))
         _on_interrupted_black_0.setTrigger(Event("_4after"))
         self.states["/on/interrupted/black"].addTransition(_on_interrupted_black_0)
         self.states["/on/interrupted/black"].addTransition(_on_interrupted_black_0)
         
         
-        # transition /on
-        _on_0 = Transition(self, self.states["/on"], [self.states["/off"]])
-        _on_0.setTrigger(Event("quit_clicked", self.getInPortName("ui")))
-        self.states["/on"].addTransition(_on_0)
-        
         # transition /on/normal
         # transition /on/normal
-        _on_normal_0 = Transition(self, self.states["/on/normal"], [self.states["/on/interrupted"]])
-        _on_normal_0.setTrigger(Event("police_interrupt_clicked", self.getInPortName("ui")))
+        _on_normal_0 = Transition(self, self.states["/on/normal"], [self.states["/deleted"]])
+        _on_normal_0.setAction(self._on_normal_0_exec)
+        _on_normal_0.setTrigger(Event("window_close", self.getInPortName("field_ui")))
         self.states["/on/normal"].addTransition(_on_normal_0)
         self.states["/on/normal"].addTransition(_on_normal_0)
+        _on_normal_1 = Transition(self, self.states["/on/normal"], [self.states["/off"]])
+        _on_normal_1.setTrigger(Event("quit_clicked", self.getInPortName("field_ui")))
+        _on_normal_1.setGuard(self._on_normal_1_guard)
+        self.states["/on/normal"].addTransition(_on_normal_1)
+        _on_normal_2 = Transition(self, self.states["/on/normal"], [self.states["/on/interrupted"]])
+        _on_normal_2.setAction(self._on_normal_2_exec)
+        _on_normal_2.setTrigger(Event("interrupt_clicked", self.getInPortName("field_ui")))
+        _on_normal_2.setGuard(self._on_normal_2_guard)
+        self.states["/on/normal"].addTransition(_on_normal_2)
         
         
         # transition /on/interrupted
         # transition /on/interrupted
-        _on_interrupted_0 = Transition(self, self.states["/on/interrupted"], [self.states["/on/normal/history"]])
-        _on_interrupted_0.setTrigger(Event("police_interrupt_clicked", self.getInPortName("ui")))
+        _on_interrupted_0 = Transition(self, self.states["/on/interrupted"], [self.states["/on/normal"]])
+        _on_interrupted_0.setTrigger(Event("interrupt_clicked", self.getInPortName("field_ui")))
+        _on_interrupted_0.setGuard(self._on_interrupted_0_guard)
         self.states["/on/interrupted"].addTransition(_on_interrupted_0)
         self.states["/on/interrupted"].addTransition(_on_interrupted_0)
     
     
+    def _creating_window_enter(self):
+        self.big_step.outputEvent(Event("create_window", self.getOutPortName("ui"), [CANVAS_DIMS[0], CANVAS_DIMS[1], "Fixed Traffic Light", self.inports['field_ui']]))
+    
+    def _creating_canvas_enter(self):
+        self.big_step.outputEvent(Event("create_canvas", self.getOutPortName("ui"), [self.window_id, CANVAS_DIMS[0], CANVAS_DIMS[1] - 100, {'background':'#222222'}, self.inports['field_ui']]))
+    
+    def _creating_trafficlight_creating_greenlight_enter(self):
+        self.big_step.outputEvent(Event("create_rectangle", self.getOutPortName("ui"), [self.canvas_id, 50, 50, 50, 50, {'fill':'#000'}, self.inports['field_ui']]))
+    
+    def _creating_trafficlight_creating_yellowlight_enter(self):
+        self.big_step.outputEvent(Event("create_rectangle", self.getOutPortName("ui"), [self.canvas_id, 50, 110, 50, 50, {'fill':'#000'}, self.inports['field_ui']]))
+    
+    def _creating_trafficlight_creating_redlight_enter(self):
+        self.big_step.outputEvent(Event("create_rectangle", self.getOutPortName("ui"), [self.canvas_id, 50, 170, 50, 50, {'fill':'#000'}, self.inports['field_ui']]))
+    
+    def _creating_interrupt_button_enter(self):
+        self.big_step.outputEvent(Event("create_button", self.getOutPortName("ui"), [self.window_id, 'Police Interrupt', self.inports['field_ui']]))
+    
+    def _creating_quit_button_enter(self):
+        self.big_step.outputEvent(Event("create_button", self.getOutPortName("ui"), [self.window_id, 'Quit', self.inports['field_ui']]))
+    
     def _on_normal_red_enter(self):
     def _on_normal_red_enter(self):
-        self.setRed();
+        self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.yellow_id, 'black']))
+        self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.red_id, 'red']))
         self.addTimer(0, 3)
         self.addTimer(0, 3)
     
     
     def _on_normal_red_exit(self):
     def _on_normal_red_exit(self):
         self.removeTimer(0)
         self.removeTimer(0)
     
     
     def _on_normal_green_enter(self):
     def _on_normal_green_enter(self):
-        self.setGreen();
+        self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.red_id, 'black']))
+        self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.green_id, 'green']))
         self.addTimer(1, 2)
         self.addTimer(1, 2)
     
     
     def _on_normal_green_exit(self):
     def _on_normal_green_exit(self):
         self.removeTimer(1)
         self.removeTimer(1)
     
     
     def _on_normal_yellow_enter(self):
     def _on_normal_yellow_enter(self):
-        self.setYellow();
+        self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.green_id, 'black']))
+        self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.yellow_id, 'yellow']))
         self.addTimer(2, 1)
         self.addTimer(2, 1)
     
     
     def _on_normal_yellow_exit(self):
     def _on_normal_yellow_exit(self):
         self.removeTimer(2)
         self.removeTimer(2)
     
     
     def _on_interrupted_yellow_enter(self):
     def _on_interrupted_yellow_enter(self):
-        self.setYellow();
+        self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.yellow_id, 'yellow']))
         self.addTimer(3, .5)
         self.addTimer(3, .5)
     
     
     def _on_interrupted_yellow_exit(self):
     def _on_interrupted_yellow_exit(self):
         self.removeTimer(3)
         self.removeTimer(3)
     
     
     def _on_interrupted_black_enter(self):
     def _on_interrupted_black_enter(self):
-        self.clear();
+        self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.yellow_id, 'black']))
         self.addTimer(4, .5)
         self.addTimer(4, .5)
     
     
     def _on_interrupted_black_exit(self):
     def _on_interrupted_black_exit(self):
         self.removeTimer(4)
         self.removeTimer(4)
     
     
     def _off_enter(self):
     def _off_enter(self):
-        self.clear();
+        self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.green_id, 'black']))
+        self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.yellow_id, 'black']))
+        self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.red_id, 'black']))
+    
+    def _on_normal_0_exec(self, parameters):
+        self.big_step.outputEvent(Event("destroy_all", self.getOutPortName("ui"), []))
+    
+    def _on_normal_1_guard(self, parameters):
+        x = parameters[0]
+        y = parameters[1]
+        button = parameters[2]
+        return button == ui.MOUSE_BUTTONS.LEFT
+    
+    def _on_normal_2_exec(self, parameters):
+        x = parameters[0]
+        y = parameters[1]
+        button = parameters[2]
+        self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.green_id, 'black']))
+        self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.yellow_id, 'black']))
+        self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.red_id, 'black']))
+    
+    def _on_normal_2_guard(self, parameters):
+        x = parameters[0]
+        y = parameters[1]
+        button = parameters[2]
+        return button == ui.MOUSE_BUTTONS.LEFT
+    
+    def _on_interrupted_0_guard(self, parameters):
+        x = parameters[0]
+        y = parameters[1]
+        button = parameters[2]
+        return button == ui.MOUSE_BUTTONS.LEFT
+    
+    def _creating_window_0_exec(self, parameters):
+        window_id = parameters[0]
+        self.window_id = window_id
+        self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [window_id, ui.EVENTS.WINDOW_CLOSE, 'window_close', self.inports['field_ui']]))
+    
+    def _creating_canvas_0_exec(self, parameters):
+        canvas_id = parameters[0]
+        self.canvas_id = canvas_id
+    
+    def _creating_trafficlight_creating_greenlight_0_exec(self, parameters):
+        canvas_id = parameters[0]
+        green_id = parameters[1]
+        self.green_id = green_id
+    
+    def _creating_trafficlight_creating_yellowlight_0_exec(self, parameters):
+        canvas_id = parameters[0]
+        yellow_id = parameters[1]
+        self.yellow_id = yellow_id
+    
+    def _creating_trafficlight_creating_redlight_0_exec(self, parameters):
+        canvas_id = parameters[0]
+        red_id = parameters[1]
+        self.red_id = red_id
+    
+    def _creating_interrupt_button_0_exec(self, parameters):
+        button_id = parameters[0]
+        self.police_button_id = button_id
+        self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [button_id, ui.EVENTS.MOUSE_CLICK, "interrupt_clicked", self.inports['field_ui']]))
+    
+    def _creating_quit_button_0_exec(self, parameters):
+        button_id = parameters[0]
+        self.quit_button_id = button_id
+        self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [button_id, ui.EVENTS.MOUSE_CLICK, "quit_clicked", self.inports['field_ui']]))
     
     
     def initializeStatechart(self):
     def initializeStatechart(self):
         # enter default state
         # enter default state
-        self.default_targets = self.states["/on"].getEffectiveTargetStates()
+        self.default_targets = self.states["/creating_window"].getEffectiveTargetStates()
         RuntimeClassBase.initializeStatechart(self)
         RuntimeClassBase.initializeStatechart(self)
 
 
 class ObjectManager(ObjectManagerBase):
 class ObjectManager(ObjectManagerBase):
@@ -299,10 +380,6 @@ class ObjectManager(ObjectManagerBase):
         if class_name == "MainApp":
         if class_name == "MainApp":
             instance = MainApp(self.controller)
             instance = MainApp(self.controller)
             instance.associations = {}
             instance.associations = {}
-            instance.associations["trafficlight"] = Association("TrafficLight", 0, -1)
-        elif class_name == "TrafficLight":
-            instance = TrafficLight(self.controller, construct_params[0])
-            instance.associations = {}
         else:
         else:
             raise Exception("Cannot instantiate class " + class_name)
             raise Exception("Cannot instantiate class " + class_name)
         return instance
         return instance
@@ -313,4 +390,5 @@ class Controller(EventLoopControllerBase):
         if behind_schedule_callback == None: behind_schedule_callback = None
         if behind_schedule_callback == None: behind_schedule_callback = None
         EventLoopControllerBase.__init__(self, ObjectManager(self), event_loop_callbacks, finished_callback, behind_schedule_callback)
         EventLoopControllerBase.__init__(self, ObjectManager(self), event_loop_callbacks, finished_callback, behind_schedule_callback)
         self.addInputPort("ui")
         self.addInputPort("ui")
+        self.addOutputPort("ui")
         self.object_manager.createInstance("MainApp", [])
         self.object_manager.createInstance("MainApp", [])

+ 245 - 125
examples/TrafficLight/sccd.xml

@@ -1,175 +1,295 @@
 <?xml version="1.0" ?>
 <?xml version="1.0" ?>
-<diagram author="Raphael Mannadiar" name="Traffic_Light_Python_Version">
+<diagram author="Sam Pieters" name="TrafficLight">
+    <description>
+        Tkinter frame with Traffic light in a single statechart.
+    </description>
     <top>
     <top>
-        from sccd.runtime.libs.ui import ui
+        from sccd.runtime.libs import ui_v2 as ui
+        CANVAS_DIMS = (100, 350)
+        CANVAS_WIDTH = 100
+        CANVAS_HEIGHT = 350
     </top>
     </top>
-
     <inport name="ui" />
     <inport name="ui" />
-
+    <outport name="ui"/>
     <class name="MainApp" default="true">
     <class name="MainApp" default="true">
-        <relationships>
-            <association name="trafficlight" class="TrafficLight" />
-        </relationships>
-        <method name="MainApp">
-            <body>
-                <![CDATA[
-                self.canvas   = ui.append_canvas(ui.window,100,310,{'background':'#eee'});
-                police_button = ui.append_button(ui.window, 'Police interrupt');
-                quit_button   = ui.append_button(ui.window, 'Quit');
-                ui.bind_event(police_button.element, ui.EVENTS.MOUSE_CLICK, self.controller, 'police_interrupt_clicked');
-                ui.bind_event(quit_button.element, ui.EVENTS.MOUSE_CLICK, self.controller, 'quit_clicked');
-                ]]>
-            </body>
-        </method>
-        <scxml initial="initializing">
-            <state id="initializing">
-                <transition target="../creating">
-                    <raise scope="cd" event="create_instance">
-                        <parameter expr='"trafficlight"' />
-                        <parameter expr='"TrafficLight"' />
-                        <parameter expr="self.canvas" />
+        <attribute name="window_id" />
+        <attribute name="canvas_id" />
+        <attribute name="green_id" />
+        <attribute name="yellow_id" />
+        <attribute name="red_id" />
+        <attribute name="police_button_id" />
+        <atrribute name="quit_button_id" />
+        <inport name="field_ui"/>
+        <scxml initial="creating_window">
+            <state id="creating_window">
+                <onentry>
+                    <raise port="ui" event="create_window">
+                        <parameter expr="CANVAS_DIMS[0]"/>
+                        <parameter expr="CANVAS_DIMS[1]"/>
+                        <parameter expr='"Fixed Traffic Light"'/>
+                        <parameter expr="self.inports['field_ui']"/>
+                    </raise>
+                </onentry>
+                <transition event="window_created" target="../creating_canvas">
+                    <parameter name="window_id" type="int" />
+                    <script>
+                        self.window_id = window_id
+                    </script>
+                    <raise port="ui" event="bind_event">
+                        <parameter expr="window_id"/>
+                        <parameter expr="ui.EVENTS.WINDOW_CLOSE"/>
+                        <parameter expr="'window_close'"/>
+                        <parameter expr="self.inports['field_ui']"/>
+                    </raise>
+                </transition>
+            </state>
+            <state id="creating_canvas">
+                <onentry>
+                    <raise port="ui" event="create_canvas">
+                        <parameter expr="self.window_id"/>
+                        <parameter expr="CANVAS_DIMS[0]"/>
+                        <parameter expr="CANVAS_DIMS[1] - 100"/>
+                        <parameter expr="{'background':'#222222'}"/>
+                        <parameter expr="self.inports['field_ui']"/>
                     </raise>
                     </raise>
+                </onentry>
+                <transition event="canvas_created" target="../creating_trafficlight">
+                    <parameter name="canvas_id" type="int"/>
+                    <script>
+                        <![CDATA[
+                        self.canvas_id = canvas_id
+                        ]]>
+                    </script>
                 </transition>
                 </transition>
             </state>
             </state>
-            <state id="creating">
-                <transition event="instance_created" target="../initialized">
-                    <parameter name="association_name" type="string"/>
-                    <raise scope="cd" event="start_instance">
-                        <parameter expr="association_name" />
+            <state id="creating_trafficlight" initial="creating_greenlight">
+                <state id="creating_greenlight">
+                    <onentry>
+                        <raise port="ui" event="create_rectangle">
+                            <parameter expr="self.canvas_id" />
+                            <parameter expr="50" />
+                            <parameter expr="50" />
+                            <parameter expr="50" />
+                            <parameter expr="50" />
+                            <parameter expr="{'fill':'#000'}" />
+                            <parameter expr="self.inports['field_ui']" />
+                        </raise>
+                    </onentry>
+                    <transition event="rectangle_created" target="../creating_yellowlight">
+                        <parameter name="canvas_id" type="int"/>
+                        <parameter name="green_id" type="int" />
+                        <script>
+                            self.green_id = green_id
+                        </script>
+                    </transition>
+                </state>
+                <state id="creating_yellowlight">
+                    <onentry>
+                        <raise port="ui" event="create_rectangle">
+                            <parameter expr="self.canvas_id" />
+                            <parameter expr="50" />
+                            <parameter expr="110" />
+                            <parameter expr="50" />
+                            <parameter expr="50" />
+                            <parameter expr="{'fill':'#000'}" />
+                            <parameter expr="self.inports['field_ui']" />
+                        </raise>
+                    </onentry>
+                    <transition event="rectangle_created" target="../creating_redlight">
+                        <parameter name="canvas_id" type="int"/>
+                        <parameter name="yellow_id" type="int" />
+                        <script>
+                            self.yellow_id = yellow_id
+                        </script>
+                    </transition>
+                </state>
+                <state id="creating_redlight">
+                    <onentry>
+                        <raise port="ui" event="create_rectangle">
+                            <parameter expr="self.canvas_id" />
+                            <parameter expr="50" />
+                            <parameter expr="170" />
+                            <parameter expr="50" />
+                            <parameter expr="50" />
+                            <parameter expr="{'fill':'#000'}" />
+                            <parameter expr="self.inports['field_ui']" />
+                        </raise>
+                    </onentry>
+                    <transition event="rectangle_created" target="../../creating_interrupt_button">
+                        <parameter name="canvas_id" type="int"/>
+                        <parameter name="red_id" type="int" />
+                        <script>
+                            self.red_id = red_id
+                        </script>
+                    </transition>
+                </state>
+            </state>
+            <state id="creating_interrupt_button">
+                <onentry>
+                    <raise port="ui" event="create_button">
+                        <parameter expr="self.window_id" />
+                        <parameter expr="'Police Interrupt'" />
+                        <parameter expr="self.inports['field_ui']" />
                     </raise>
                     </raise>
-                    <raise scope="narrow" event="set_association_name" target="association_name">
-                        <parameter expr="association_name" />
+                </onentry>
+                <transition event="button_created" target="../creating_quit_button">
+                    <parameter name="button_id" type="int"/>
+                    <script>
+                        self.police_button_id = button_id
+                    </script> 
+                    <raise port="ui" event="bind_event">
+                        <parameter expr="button_id"/>
+                        <parameter expr="ui.EVENTS.MOUSE_CLICK"/>
+                        <parameter expr='"interrupt_clicked"'/>
+                        <parameter expr="self.inports['field_ui']"/>
                     </raise>
                     </raise>
                 </transition>
                 </transition>
             </state>
             </state>
-            <state id="initialized">
+            <state id="creating_quit_button">
+                <onentry>
+                    <raise port="ui" event="create_button">
+                        <parameter expr="self.window_id" />
+                        <parameter expr="'Quit'" />
+                        <parameter expr="self.inports['field_ui']" />
+                    </raise>
+                </onentry>
+                <transition event="button_created" target="../on">
+                    <parameter name="button_id" type="int"/>
+                    <script>
+                        self.quit_button_id = button_id
+                    </script> 
+                    <raise port="ui" event="bind_event">
+                        <parameter expr="button_id"/>
+                        <parameter expr="ui.EVENTS.MOUSE_CLICK"/>
+                        <parameter expr='"quit_clicked"'/>
+                        <parameter expr="self.inports['field_ui']"/>
+                    </raise>
+                </transition>
             </state>
             </state>
-        </scxml>
-    </class>
-
-    <class name="TrafficLight">
-        <relationships>
-        </relationships>
-        <method name="TrafficLight">
-            <parameter name="canvas" />
-            <body>
-                <![CDATA[
-                size        = 100;
-                offset      = size+5;
-                self.RED    = 0;
-                self.YELLOW = 1;
-                self.GREEN  = 2;
-                self.colors = ['#f00','#ff0','#0f0']
-                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'})];
-                ]]>
-            </body>
-        </method>
-        <method name="clear">
-            <body>
-                <![CDATA[
-                self.lights[self.RED].set_color('#000');
-                self.lights[self.YELLOW].set_color('#000');
-                self.lights[self.GREEN].set_color('#000');
-                ]]>
-            </body>
-        </method>
-        <method name="setGreen">
-            <body>
-                <![CDATA[
-                self.clear();
-                self.lights[self.GREEN].set_color(self.colors[self.GREEN]);
-                ]]>
-            </body>
-        </method>
-        <method name="setYellow">
-            <body>
-                <![CDATA[
-                self.clear();
-                self.lights[self.YELLOW].set_color(self.colors[self.YELLOW]);
-                ]]>
-            </body>
-        </method>
-        <method name="setRed">
-            <body>
-                <![CDATA[
-                self.clear();
-                self.lights[self.RED].set_color(self.colors[self.RED]);
-                ]]>
-            </body>
-        </method>
-        <scxml initial="on">
             <state id="on" initial="normal">
             <state id="on" initial="normal">
                 <state id="normal" initial="red">
                 <state id="normal" initial="red">
+                    <transition port="field_ui" event="window_close" target="../../deleted" >
+                        <raise port="ui" event="destroy_all" />
+                    </transition>
+                    <transition port='field_ui' event="quit_clicked" target='../../off' cond="button == ui.MOUSE_BUTTONS.LEFT">
+                        <parameter name="x" />
+                        <parameter name="y" />
+                        <parameter name="button" />
+                    </transition>
+                    <transition port='field_ui' event="interrupt_clicked" target='../interrupted' cond="button == ui.MOUSE_BUTTONS.LEFT">
+                        <parameter name="x" />
+                        <parameter name="y" />
+                        <parameter name="button" />
+                        <raise port="ui" event="set_element_color">
+                            <parameter expr="self.canvas_id" />
+                            <parameter expr="self.green_id" />
+                            <parameter expr="'black'" />
+                        </raise>
+                        <raise port="ui" event="set_element_color">
+                            <parameter expr="self.canvas_id" />
+                            <parameter expr="self.yellow_id" />
+                            <parameter expr="'black'" />
+                        </raise>
+                        <raise port="ui" event="set_element_color">
+                            <parameter expr="self.canvas_id" />
+                            <parameter expr="self.red_id" />
+                            <parameter expr="'black'" />
+                        </raise>
+                    </transition>
                     <state id="red">
                     <state id="red">
                         <onentry>
                         <onentry>
-                            <script>
-                                <![CDATA[
-                                self.setRed();
-                                ]]>
-                            </script>
+                            <raise port="ui" event="set_element_color">
+                                <parameter expr="self.canvas_id" />
+                                <parameter expr="self.yellow_id" />
+                                <parameter expr="'black'" />
+                            </raise>
+                            <raise port="ui" event="set_element_color">
+                                <parameter expr="self.canvas_id" />
+                                <parameter expr="self.red_id" />
+                                <parameter expr="'red'" />
+                            </raise>
                         </onentry>
                         </onentry>
                         <transition after='3' target='../green'/>
                         <transition after='3' target='../green'/>
                     </state>
                     </state>
                     <state id="green">
                     <state id="green">
                         <onentry>
                         <onentry>
-                            <script>
-                                <![CDATA[
-                                self.setGreen();
-                                ]]>
-                            </script>
+                            <raise port="ui" event="set_element_color">
+                                <parameter expr="self.canvas_id" />
+                                <parameter expr="self.red_id" />
+                                <parameter expr="'black'" />
+                            </raise>
+                            <raise port="ui" event="set_element_color">
+                                <parameter expr="self.canvas_id" />
+                                <parameter expr="self.green_id" />
+                                <parameter expr="'green'" />
+                            </raise>
                         </onentry>
                         </onentry>
                         <transition after='2' target='../yellow'/>
                         <transition after='2' target='../yellow'/>
                     </state>
                     </state>
                     <state id="yellow">
                     <state id="yellow">
                         <onentry>
                         <onentry>
-                            <script>
-                                <![CDATA[
-                                self.setYellow();
-                                ]]>
-                            </script>
+                            <raise port="ui" event="set_element_color">
+                                <parameter expr="self.canvas_id" />
+                                <parameter expr="self.green_id" />
+                                <parameter expr="'black'" />
+                            </raise>
+                            <raise port="ui" event="set_element_color">
+                                <parameter expr="self.canvas_id" />
+                                <parameter expr="self.yellow_id" />
+                                <parameter expr="'yellow'" />
+                            </raise>
                         </onentry>
                         </onentry>
-                    <transition after='1' target='../red'/>
+                        <transition after='1' target='../red'/>
                     </state>
                     </state>
-                    <transition event='police_interrupt_clicked' port='ui' target='../interrupted'/>
-                    <history id="history"/>
                 </state>
                 </state>
                 <state id="interrupted" initial="yellow">
                 <state id="interrupted" initial="yellow">
                     <state id="yellow">
                     <state id="yellow">
                         <onentry>
                         <onentry>
-                            <script>
-                                <![CDATA[
-                                self.setYellow();
-                                ]]>
-                            </script>
+                            <raise port="ui" event="set_element_color">
+                                <parameter expr="self.canvas_id" />
+                                <parameter expr="self.yellow_id" />
+                                <parameter expr="'yellow'" />
+                            </raise>
                         </onentry>
                         </onentry>
                         <transition after='.5' target='../black'/>
                         <transition after='.5' target='../black'/>
                     </state>
                     </state>
                     <state id="black">
                     <state id="black">
                         <onentry>
                         <onentry>
-                            <script>
-                                <![CDATA[
-                                self.clear();
-                                ]]>
-                            </script>
+                            <raise port="ui" event="set_element_color">
+                                <parameter expr="self.canvas_id" />
+                                <parameter expr="self.yellow_id" />
+                                <parameter expr="'black'" />
+                            </raise>
                         </onentry>
                         </onentry>
                         <transition after='.5' target='../yellow'/>
                         <transition after='.5' target='../yellow'/>
                     </state>
                     </state>
-                    <transition event='police_interrupt_clicked' port='ui' target='../normal/history'/>
+                    <transition port='field_ui' event="interrupt_clicked" target='../normal' cond="button == ui.MOUSE_BUTTONS.LEFT">
+                        <parameter name="x" />
+                        <parameter name="y" />
+                        <parameter name="button" />
+                    </transition>
                 </state>
                 </state>
-                <transition event='quit_clicked' port='ui' target='../off'/>
             </state>
             </state>
             <state id="off">
             <state id="off">
                 <onentry>
                 <onentry>
-                    <script>
-                        <![CDATA[
-                        self.clear();
-                        ]]>
-                    </script>
+                    <raise port="ui" event="set_element_color">
+                        <parameter expr="self.canvas_id" />
+                        <parameter expr="self.green_id" />
+                        <parameter expr="'black'" />
+                    </raise>
+                    <raise port="ui" event="set_element_color">
+                        <parameter expr="self.canvas_id" />
+                        <parameter expr="self.yellow_id" />
+                        <parameter expr="'black'" />
+                    </raise>
+                    <raise port="ui" event="set_element_color">
+                        <parameter expr="self.canvas_id" />
+                        <parameter expr="self.red_id" />
+                        <parameter expr="'black'" />
+                    </raise>
                 </onentry>
                 </onentry>
             </state>
             </state>
+            <state id="deleted" />
         </scxml>
         </scxml>
     </class>
     </class>
 </diagram>
 </diagram>