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)
 
-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:
 Tkinter frame with bouncing balls in it.
 """
 
 from sccd.runtime.DEVS_statecharts_core import *
 from sccd.runtime.libs import ui_v2 as ui
-from sccd.runtime.libs.utils import utils
 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):
     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']]))
     
     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):
         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):
         # 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'];
-        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.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']
@@ -763,8 +761,8 @@ class BallInstance(RuntimeClassBase):
         y = parameters[1]
         button = parameters[2]
         # 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']
         dy = y - self.pos['y']
@@ -831,8 +829,6 @@ class ObjectManager(TheObjectManager):
 
 class Controller(CoupledDEVS):
     def __init__(self, name):
-        self.terminate = False
-
         CoupledDEVS.__init__(self, name)
         self.in_ui = self.addInPort("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)
 
-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:
 Tkinter frame with bouncing balls in it.
 """
 
 from sccd.runtime.statecharts_core import *
 from sccd.runtime.libs import ui_v2 as ui
-from sccd.runtime.libs.utils import utils
 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):
     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']]))
     
     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):
         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):
         # 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'];
-        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.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']
@@ -701,8 +699,8 @@ class Ball(RuntimeClassBase):
         y = parameters[1]
         button = parameters[2]
         # 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']
         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" ?>
-<diagram author="Simon Van Mierlo+Raphael Mannadiar" name="Bouncing_Balls_Python_Version">
+<diagram author="Sam Pieters" name="Bouncing_Balls_DEVS_Version">
     <description>
         Tkinter frame with bouncing balls in it.
     </description>
     <top>
         from sccd.runtime.libs import ui_v2 as ui
-        from sccd.runtime.libs.utils import utils
         import random
 
-        CANVAS_WIDTH = 800
-        CANVAS_HEIGHT = 550
+        CANVAS_DIMS = (800, 550)
     </top>
     <inport name="ui"/>
     <outport name="ui"/>
@@ -101,38 +99,34 @@
                     <transition event="set_association_name" target="../creating_window">
                         <parameter name="association_name" type="str" />
                         <script>
-                            <![CDATA[
                             self.association_name = association_name
-                            ]]>
                         </script>
                     </transition>
                 </state>
                 <state id="creating_window">
                     <onentry>
                         <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 -->
                         </raise>
                     </onentry>
                     <transition event="window_created" target="../creating_canvas">
                         <parameter name="window_id" type="int" />
                         <script>
-                            <![CDATA[
                             self.window_id = window_id
-                            ]]>
                         </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="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="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>
@@ -140,31 +134,29 @@
                 <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"/><!-- 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 -->
                         </raise>
                     </onentry>
                     <transition event="canvas_created" target="../creating_button">
                         <parameter name="canvas_id" type="int"/>
                         <script>
-                            <![CDATA[
                             self.canvas_id = canvas_id
-                            ]]>
                         </script>
                         <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 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 port="ui" event="bind_event">
                             <parameter expr="canvas_id"/><!-- widget_id -->
@@ -336,13 +328,11 @@
             <parameter name="x" />
             <parameter name="y" />
             <body>
-                <![CDATA[
                 self.canvas_id = canvas_id;
                 self.r = 20.0;
                 self.vel = {'x': random.uniform(-5.0, 5.0), 'y': random.uniform(-5.0, 5.0)};
                 self.pos = {'x': x, 'y': y};
                 self.smooth = 0.6; # value between 0 and 1
-                ]]>
             </body>
         </constructor>
         <destructor>
@@ -404,9 +394,9 @@
                         <script>
                             <![CDATA[
                             # 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'];
-                            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'];
                             ]]>
                         </script>
@@ -438,10 +428,9 @@
                         <parameter name="y" />
                         <parameter name="button" />
                         <script>
-                            <![CDATA[
                             # 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']
                             dy = y - self.pos['y']
@@ -450,9 +439,8 @@
                                 'x': (1-self.smooth)*dx + self.smooth*self.vel['x'],
                                 'y': (1-self.smooth)*dy + self.smooth*self.vel['y']
                             }
-
+                            
                             self.pos = {'x': x, 'y': y}
-                            ]]>
                         </script>
                         <raise port="ui" event="set_element_pos">
                             <parameter expr="self.canvas_id"/>
@@ -477,9 +465,7 @@
                         <parameter name="y" />
                         <parameter name="button" />
                         <script>
-                            <![CDATA[
                             self.mouse_pos = {'x':x, 'y':y};
-                            ]]>
                         </script>
                     </transition>
                     <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
         EventLoopControllerBase.__init__(self, ObjectManager(self), event_loop_callbacks, finished_callback, behind_schedule_callback)
         self.addInputPort("ui")
+        self.addOutputPort("ui")
         self.object_manager.createInstance("MainApp", [])

+ 22 - 23
examples/FixedTimerEventloop/sccd.xml

@@ -4,8 +4,7 @@
         from sccd.runtime.libs.ui import ui
         import time
 
-        CANVAS_WIDTH = 350
-        CANVAS_HEIGHT = 300
+        CANVAS_DIMS = (350, 300)
     </top>
     
     <inport name="ui" />
@@ -22,10 +21,10 @@
             <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 -->
+                        <parameter expr="CANVAS_DIMS[0]"/>
+                        <parameter expr="CANVAS_DIMS[1]"/>
+                        <parameter expr='"Fixed Timer"'/>
+                        <parameter expr="self.inports['field_ui']"/>
                     </raise>
                 </onentry>
                 <transition event="window_created" target="../creating_canvas">
@@ -37,27 +36,27 @@
                         ]]>
                     </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 -->
+                        <parameter expr="window_id"/>
+                        <parameter expr="ui.EVENTS.WINDOW_CLOSE"/>
+                        <parameter expr="'window_close'"/>
+                        <parameter expr="self.inports['field_ui']"/>
                     </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 -->
+                        <parameter expr="window_id"/>
+                        <parameter expr="ui.EVENTS.KEY_PRESS"/>
+                        <parameter expr="'key_press'"/>
+                        <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"/><!-- 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>
                 </onentry>
                 <transition event="canvas_created" target="../creating_clock_text">
@@ -119,10 +118,10 @@
                         self.button_id = button_id
                     </script> 
                     <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>
                 </transition>
             </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)
 
-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 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):
     def __init__(self, atomdevs):
         RuntimeClassBase.__init__(self, atomdevs)
         self.associations = {}
-        self.associations["trafficlight"] = Association("TrafficLight", 0, -1)
         
         self.semantics.big_step_maximality = StatechartSemantics.TakeMany
         self.semantics.internal_event_lifeline = StatechartSemantics.Queue
@@ -29,15 +29,25 @@ class MainAppInstance(RuntimeClassBase):
         # 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
         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):
-        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):
         pass
@@ -49,265 +59,146 @@ class MainAppInstance(RuntimeClassBase):
         # state <root>
         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
-        self.states["/on"] = State(1, "/on", self)
+        self.states["/on"] = State(9, "/on", self)
         
         # 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
-        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"].setExit(self._on_normal_red_exit)
         
         # 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"].setExit(self._on_normal_green_exit)
         
         # 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"].setExit(self._on_normal_yellow_exit)
         
-        # state /on/normal/history
-        self.states["/on/normal/history"] = ShallowHistoryState(6, "/on/normal/history", self)
-        
         # 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
-        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"].setExit(self._on_interrupted_yellow_exit)
         
         # 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"].setExit(self._on_interrupted_black_exit)
         
         # state /off
-        self.states["/off"] = State(10, "/off", self)
+        self.states["/off"] = State(17, "/off", self)
         self.states["/off"].setEnter(self._off_enter)
         
+        # state /deleted
+        self.states["/deleted"] = State(18, "/deleted", self)
+        
         # 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["/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/interrupted"])
         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/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/black"])
         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/normal"].default_state = self.states["/on/normal/red"]
         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
         _on_normal_red_0 = Transition(self, self.states["/on/normal/red"], [self.states["/on/normal/green"]])
         _on_normal_red_0.setTrigger(Event("_0after"))
@@ -333,199 +224,192 @@ class TrafficLightInstance(RuntimeClassBase):
         _on_interrupted_black_0.setTrigger(Event("_4after"))
         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
-        _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)
+        _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
-        _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)
     
+    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):
-        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)
     
     def _on_normal_red_exit(self):
         self.removeTimer(0)
     
     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)
     
     def _on_normal_green_exit(self):
         self.removeTimer(1)
     
     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)
     
     def _on_normal_yellow_exit(self):
         self.removeTimer(2)
     
     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)
     
     def _on_interrupted_yellow_exit(self):
         self.removeTimer(3)
     
     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)
     
     def _on_interrupted_black_exit(self):
         self.removeTimer(4)
     
     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):
         # enter default state
-        self.default_targets = self.states["/on"].getEffectiveTargetStates()
+        self.default_targets = self.states["/creating_window"].getEffectiveTargetStates()
         RuntimeClassBase.initializeStatechart(self)
 
-class TrafficLight(AtomicDEVS, ObjectManagerBase):
+class MainApp(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.obj_manager_in = self.addInPort("obj_manager_in")
+        ObjectManagerBase.__init__(self, name)
         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:
     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):
-        AtomicDEVS.__init__(self, name)
+        TheObjectManager.__init__(self, name)
         self.State = ObjectManagerState()
         self.input = self.addInPort("input")
-        self.output = {}
         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):
     def __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.atomic0 = self.addSubModel(MainApp("MainApp"))
-        self.atomic1 = self.addSubModel(TrafficLight("TrafficLight"))
         self.connectPorts(self.atomic0.obj_manager_out, self.objectmanager.input)
         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 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__':
-	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()
-	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)
 
-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.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):
     def __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.internal_event_lifeline = StatechartSemantics.Queue
@@ -25,15 +30,19 @@ class MainApp(RuntimeClassBase):
         # 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
         MainApp.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):
         pass
@@ -45,169 +54,146 @@ class MainApp(RuntimeClassBase):
         # state <root>
         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
-        self.states["/on"] = State(1, "/on", self)
+        self.states["/on"] = State(9, "/on", self)
         
         # 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
-        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"].setExit(self._on_normal_red_exit)
         
         # 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"].setExit(self._on_normal_green_exit)
         
         # 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"].setExit(self._on_normal_yellow_exit)
         
-        # state /on/normal/history
-        self.states["/on/normal/history"] = ShallowHistoryState(6, "/on/normal/history", self)
-        
         # 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
-        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"].setExit(self._on_interrupted_yellow_exit)
         
         # 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"].setExit(self._on_interrupted_black_exit)
         
         # state /off
-        self.states["/off"] = State(10, "/off", self)
+        self.states["/off"] = State(17, "/off", self)
         self.states["/off"].setEnter(self._off_enter)
         
+        # state /deleted
+        self.states["/deleted"] = State(18, "/deleted", self)
+        
         # 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["/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/interrupted"])
         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/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/black"])
         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/normal"].default_state = self.states["/on/normal/red"]
         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
         _on_normal_red_0 = Transition(self, self.states["/on/normal/red"], [self.states["/on/normal/green"]])
         _on_normal_red_0.setTrigger(Event("_0after"))
@@ -233,62 +219,157 @@ class TrafficLight(RuntimeClassBase):
         _on_interrupted_black_0.setTrigger(Event("_4after"))
         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
-        _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)
+        _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
-        _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)
     
+    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):
-        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)
     
     def _on_normal_red_exit(self):
         self.removeTimer(0)
     
     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)
     
     def _on_normal_green_exit(self):
         self.removeTimer(1)
     
     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)
     
     def _on_normal_yellow_exit(self):
         self.removeTimer(2)
     
     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)
     
     def _on_interrupted_yellow_exit(self):
         self.removeTimer(3)
     
     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)
     
     def _on_interrupted_black_exit(self):
         self.removeTimer(4)
     
     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):
         # enter default state
-        self.default_targets = self.states["/on"].getEffectiveTargetStates()
+        self.default_targets = self.states["/creating_window"].getEffectiveTargetStates()
         RuntimeClassBase.initializeStatechart(self)
 
 class ObjectManager(ObjectManagerBase):
@@ -299,10 +380,6 @@ class ObjectManager(ObjectManagerBase):
         if class_name == "MainApp":
             instance = MainApp(self.controller)
             instance.associations = {}
-            instance.associations["trafficlight"] = Association("TrafficLight", 0, -1)
-        elif class_name == "TrafficLight":
-            instance = TrafficLight(self.controller, construct_params[0])
-            instance.associations = {}
         else:
             raise Exception("Cannot instantiate class " + class_name)
         return instance
@@ -313,4 +390,5 @@ class Controller(EventLoopControllerBase):
         if behind_schedule_callback == None: behind_schedule_callback = None
         EventLoopControllerBase.__init__(self, ObjectManager(self), event_loop_callbacks, finished_callback, behind_schedule_callback)
         self.addInputPort("ui")
+        self.addOutputPort("ui")
         self.object_manager.createInstance("MainApp", [])

+ 245 - 125
examples/TrafficLight/sccd.xml

@@ -1,175 +1,295 @@
 <?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>
-        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>
-
     <inport name="ui" />
-
+    <outport name="ui"/>
     <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>
+                </onentry>
+                <transition event="canvas_created" target="../creating_trafficlight">
+                    <parameter name="canvas_id" type="int"/>
+                    <script>
+                        <![CDATA[
+                        self.canvas_id = canvas_id
+                        ]]>
+                    </script>
                 </transition>
             </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 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>
                 </transition>
             </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>
-        </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="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">
                         <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>
                         <transition after='3' target='../green'/>
                     </state>
                     <state id="green">
                         <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>
                         <transition after='2' target='../yellow'/>
                     </state>
                     <state id="yellow">
                         <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>
-                    <transition after='1' target='../red'/>
+                        <transition after='1' target='../red'/>
                     </state>
-                    <transition event='police_interrupt_clicked' port='ui' target='../interrupted'/>
-                    <history id="history"/>
                 </state>
                 <state id="interrupted" initial="yellow">
                     <state id="yellow">
                         <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>
                         <transition after='.5' target='../black'/>
                     </state>
                     <state id="black">
                         <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>
                         <transition after='.5' target='../yellow'/>
                     </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>
-                <transition event='quit_clicked' port='ui' target='../off'/>
             </state>
             <state id="off">
                 <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>
             </state>
+            <state id="deleted" />
         </scxml>
     </class>
 </diagram>