Browse Source

Make use of "spawners" instead of hardcoding the chatwindow

Yentl Van Tendeloo 8 years ago
parent
commit
2f1b7d1baf
7 changed files with 203 additions and 122 deletions
  1. 1 1
      chatwindow.py
  2. 52 17
      classes/main_app.xml
  3. 1 2
      classes/window/activity.xml
  4. 1 1
      classes/window/process_enact.xml
  5. 141 98
      frontend.py
  6. 2 0
      run_chatwindow.py
  7. 5 3
      runner.py

+ 1 - 1
chatwindow.py

@@ -1,7 +1,7 @@
 """
 """
 Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
 Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
 
 
-Date:   Wed Nov 15 08:57:11 2017
+Date:   Wed Nov 15 09:41:32 2017
 
 
 Model author: Yentl Van Tendeloo
 Model author: Yentl Van Tendeloo
 Model name:   ChatWindow- Tkinter Version 
 Model name:   ChatWindow- Tkinter Version 

+ 52 - 17
classes/main_app.xml

@@ -11,6 +11,7 @@
         <parameter name="model"/>
         <parameter name="model"/>
         <parameter name="limited_mode"/>
         <parameter name="limited_mode"/>
         <parameter name="taskname"/>
         <parameter name="taskname"/>
+        <parameter name="spawn"/>
         <body>
         <body>
             self.nr_of_windows = 0
             self.nr_of_windows = 0
             self.root = root
             self.root = root
@@ -27,6 +28,7 @@
             data['mv_address'] = location
             data['mv_address'] = location
             data['timeout'] = 20.0
             data['timeout'] = 20.0
             data['taskname'] = taskname
             data['taskname'] = taskname
+            data['spawn'] = spawn
         </body>
         </body>
     </constructor>
     </constructor>
     <scxml initial="parallel">
     <scxml initial="parallel">
@@ -175,30 +177,63 @@
                             </state>
                             </state>
                         </state>
                         </state>
 
 
-                        <state id="execute_SC" initial="spawn_chatwindow">
-                            <onentry>
-                                <raise event="create_instance" scope="cd">
-                                    <parameter expr="'windows'"/>
-                                    <parameter expr="'ChatWindow'"/>
-                                </raise>
-                            </onentry>
+                        <state id="execute_SC" initial="spawn">
+                            <state id="spawn">
+                                <transition target="../wait_subprocess">
+                                    <parameter name="result"/>
+                                    <script>
+                                        self.subprocess = subprocess.Popen(data['spawn'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
+
+                                        # If you are using Windows, then this ugly code is for you!
+                                        # Windows does not allow asynchronous reading of stdin and stdout, so we have to mess around with threads.
+                                        # Interestingly, threads don't work well with SCCD, so this is a gamble.
+                                        # On UNIX systems, a simple "select" statement would have sufficed in the SCCD condition, but Windows doesn't like elegant solutions...
+                                        def enqueue_output(out, queue):
+                                            for line in iter(out.readline, b''):
+                                                queue.append(line)
+                                            out.close()
+
+                                        self.output_queue = []
+                                        p = threading.Thread(target=enqueue_output, arguments=[self.subprocess.stdout, self.output_queue])
+                                        p.daemon = True
+                                        p.start()
+                                    </script>
+                                </transition>
+                            </state>
 
 
-                            <state id="spawn_chatwindow">
-                                <transition event="instance_created" target=".">
-                                    <parameter name="assoc_name"/>
-                                    <raise event="start_instance" scope="cd">
-                                        <parameter expr="assoc_name"/>
-                                    </raise>
-                                    <raise event="assoc_name" scope="narrow" target="assoc_name">
-                                        <parameter expr="assoc_name"/>
+                            <state id="wait_subprocess">
+                                <transition event="mv_data_output" target=".">
+                                    <parameter name="value"/>
+                                    <script>
+                                        # Send data to the spawned subprocess
+                                        self.subprocess.stdin.write(value)
+                                    </script>
+                                </transition>
+
+                                <transition cond="self.output_queue" target=".">
+                                    <raise event="mv_data_input">
+                                        <parameter expr="self.output_queue.pop(0)"/>
+                                        <parameter expr="None"/>
                                     </raise>
                                     </raise>
                                 </transition>
                                 </transition>
 
 
-                                <transition event="delete_me" target="../../../../stopped">
+                                <transition event="mv_response" target="../stopping">
+                                    <script>
+                                        self.subprocess.terminate()
+                                    </script>
+                                </transition>
+
+                                <transition cond="self.subprocess.poll() is not None" target="../stopping">
                                     <script>
                                     <script>
-                                        sys.exit(0)
+                                        print("Finished execution of activity!")
                                     </script>
                                     </script>
                                 </transition>
                                 </transition>
+
+                                <transition after="0.5" target="."/>
+                            </state>
+
+                            <state id="stopping">
+                                <transition after="2.0" target="../../../../stopped"/>
                             </state>
                             </state>
                         </state>
                         </state>
                     </state>
                     </state>

+ 1 - 2
classes/window/activity.xml

@@ -253,7 +253,7 @@
                         <transition event="mv_response" target="../processing">
                         <transition event="mv_response" target="../processing">
                             <parameter name="taskname"/>
                             <parameter name="taskname"/>
                             <script>
                             <script>
-                                subprocess.Popen([sys.executable, sys.argv[0], "--address", data['mv_address'], "--username", data['username'], "--password", data['password'], "--taskname", taskname])
+                                self.subprocess = subprocess.Popen([sys.executable, sys.argv[0], "--address", data['mv_address'], "--username", data['username'], "--password", data['password'], "--taskname", taskname, "--spawn", "run_chatwindow.py"])
                             </script>
                             </script>
                         </transition>
                         </transition>
                     </state>
                     </state>
@@ -273,7 +273,6 @@
                                 <script>
                                 <script>
                                     tag, model = self.exec_output_signature.popitem()
                                     tag, model = self.exec_output_signature.popitem()
                                     metamodel = self.output_signature[tag]
                                     metamodel = self.output_signature[tag]
-                                    print("Setting context for " + str((model, metamodel)))
                                 </script>
                                 </script>
                                 <raise event="mv_request" scope="broad">
                                 <raise event="mv_request" scope="broad">
                                     <parameter expr="'alter_context'"/>
                                     <parameter expr="'alter_context'"/>

+ 1 - 1
classes/window/process_enact.xml

@@ -231,7 +231,7 @@
                             <parameter name="result"/>
                             <parameter name="result"/>
                             <script>
                             <script>
                                 taskname, operation = result
                                 taskname, operation = result
-                                subprocess.Popen([sys.executable, sys.argv[0], "--address", data['mv_address'], "--username", data['username'], "--password", data['password'], "--taskname", taskname])
+                                subprocess.Popen([sys.executable, sys.argv[0], "--address", data['mv_address'], "--username", data['username'], "--password", data['password'], "--taskname", taskname, "--spawn", "run_chatwindow.py"])
                             </script>
                             </script>
                         </transition>
                         </transition>
                     </state>
                     </state>

+ 141 - 98
frontend.py

@@ -1,7 +1,7 @@
 """
 """
 Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
 Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
 
 
-Date:   Tue Nov 14 15:32:55 2017
+Date:   Wed Nov 15 10:17:38 2017
 
 
 Model author: Yentl Van Tendeloo
 Model author: Yentl Van Tendeloo
 Model name:   Modelverse Visual Editor - Tkinter Version 
 Model name:   Modelverse Visual Editor - Tkinter Version 
@@ -25,7 +25,7 @@ global current_metamodel
 # package "Modelverse Visual Editor - Tkinter Version "
 # package "Modelverse Visual Editor - Tkinter Version "
 
 
 class MainApp(RuntimeClassBase):
 class MainApp(RuntimeClassBase):
-    def __init__(self, controller, root, location, username, password, model, limited_mode, taskname):
+    def __init__(self, controller, root, location, username, password, model, limited_mode, taskname, spawn):
         RuntimeClassBase.__init__(self, controller)
         RuntimeClassBase.__init__(self, controller)
         
         
         self.semantics.big_step_maximality = StatechartSemantics.TakeMany
         self.semantics.big_step_maximality = StatechartSemantics.TakeMany
@@ -38,9 +38,9 @@ class MainApp(RuntimeClassBase):
         self.build_statechart_structure()
         self.build_statechart_structure()
         
         
         # call user defined constructor
         # call user defined constructor
-        MainApp.user_defined_constructor(self, root, location, username, password, model, limited_mode, taskname)
+        MainApp.user_defined_constructor(self, root, location, username, password, model, limited_mode, taskname, spawn)
     
     
-    def user_defined_constructor(self, root, location, username, password, model, limited_mode, taskname):
+    def user_defined_constructor(self, root, location, username, password, model, limited_mode, taskname, spawn):
         self.nr_of_windows = 0
         self.nr_of_windows = 0
         self.root = root
         self.root = root
         
         
@@ -56,6 +56,7 @@ class MainApp(RuntimeClassBase):
         data['mv_address'] = location
         data['mv_address'] = location
         data['timeout'] = 20.0
         data['timeout'] = 20.0
         data['taskname'] = taskname
         data['taskname'] = taskname
+        data['spawn'] = spawn
     
     
     def user_defined_destructor(self):
     def user_defined_destructor(self):
         pass
         pass
@@ -120,62 +121,71 @@ class MainApp(RuntimeClassBase):
         
         
         # state /parallel/behaviour/init_modelverse/conversing/execute_SC
         # state /parallel/behaviour/init_modelverse/conversing/execute_SC
         self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC"] = State(15, "/parallel/behaviour/init_modelverse/conversing/execute_SC", self)
         self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC"] = State(15, "/parallel/behaviour/init_modelverse/conversing/execute_SC", self)
-        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC"].setEnter(self._parallel_behaviour_init_modelverse_conversing_execute_SC_enter)
         
         
-        # state /parallel/behaviour/init_modelverse/conversing/execute_SC/spawn_chatwindow
-        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/spawn_chatwindow"] = State(16, "/parallel/behaviour/init_modelverse/conversing/execute_SC/spawn_chatwindow", self)
+        # state /parallel/behaviour/init_modelverse/conversing/execute_SC/spawn
+        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/spawn"] = State(16, "/parallel/behaviour/init_modelverse/conversing/execute_SC/spawn", self)
+        
+        # state /parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess
+        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess"] = State(17, "/parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess", self)
+        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess"].setEnter(self._parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_enter)
+        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess"].setExit(self._parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_exit)
+        
+        # state /parallel/behaviour/init_modelverse/conversing/execute_SC/stopping
+        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/stopping"] = State(18, "/parallel/behaviour/init_modelverse/conversing/execute_SC/stopping", self)
+        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/stopping"].setEnter(self._parallel_behaviour_init_modelverse_conversing_execute_SC_stopping_enter)
+        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/stopping"].setExit(self._parallel_behaviour_init_modelverse_conversing_execute_SC_stopping_exit)
         
         
         # state /parallel/behaviour/init_modelverse/logging_in_modelverse
         # state /parallel/behaviour/init_modelverse/logging_in_modelverse
-        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse"] = State(17, "/parallel/behaviour/init_modelverse/logging_in_modelverse", self)
+        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse"] = State(19, "/parallel/behaviour/init_modelverse/logging_in_modelverse", self)
         
         
         # state /parallel/behaviour/init_modelverse/logging_in_modelverse/prompt_username
         # state /parallel/behaviour/init_modelverse/logging_in_modelverse/prompt_username
-        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/prompt_username"] = State(18, "/parallel/behaviour/init_modelverse/logging_in_modelverse/prompt_username", self)
+        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/prompt_username"] = State(20, "/parallel/behaviour/init_modelverse/logging_in_modelverse/prompt_username", self)
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/prompt_username"].setEnter(self._parallel_behaviour_init_modelverse_logging_in_modelverse_prompt_username_enter)
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/prompt_username"].setEnter(self._parallel_behaviour_init_modelverse_logging_in_modelverse_prompt_username_enter)
         
         
         # state /parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials
         # state /parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials
-        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials"] = State(19, "/parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials", self)
+        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials"] = State(21, "/parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials", self)
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials"].setExit(self._parallel_behaviour_init_modelverse_logging_in_modelverse_wait_for_credentials_exit)
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials"].setExit(self._parallel_behaviour_init_modelverse_logging_in_modelverse_wait_for_credentials_exit)
         
         
         # state /parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials/responsive
         # state /parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials/responsive
-        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials/responsive"] = State(20, "/parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials/responsive", self)
+        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials/responsive"] = State(22, "/parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials/responsive", self)
         
         
         # state /parallel/behaviour/init_modelverse/logging_in_modelverse/login
         # state /parallel/behaviour/init_modelverse/logging_in_modelverse/login
-        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/login"] = State(21, "/parallel/behaviour/init_modelverse/logging_in_modelverse/login", self)
+        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/login"] = State(23, "/parallel/behaviour/init_modelverse/logging_in_modelverse/login", self)
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/login"].setEnter(self._parallel_behaviour_init_modelverse_logging_in_modelverse_login_enter)
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/login"].setEnter(self._parallel_behaviour_init_modelverse_logging_in_modelverse_login_enter)
         
         
         # state /parallel/behaviour/init_modelverse/logging_in_modelverse/register_SCD
         # state /parallel/behaviour/init_modelverse/logging_in_modelverse/register_SCD
-        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/register_SCD"] = State(22, "/parallel/behaviour/init_modelverse/logging_in_modelverse/register_SCD", self)
+        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/register_SCD"] = State(24, "/parallel/behaviour/init_modelverse/logging_in_modelverse/register_SCD", self)
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/register_SCD"].setEnter(self._parallel_behaviour_init_modelverse_logging_in_modelverse_register_SCD_enter)
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/register_SCD"].setEnter(self._parallel_behaviour_init_modelverse_logging_in_modelverse_register_SCD_enter)
         
         
         # state /parallel/behaviour/init_modelverse/logging_in_modelverse/register_conf_bottom
         # state /parallel/behaviour/init_modelverse/logging_in_modelverse/register_conf_bottom
-        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/register_conf_bottom"] = State(23, "/parallel/behaviour/init_modelverse/logging_in_modelverse/register_conf_bottom", self)
+        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/register_conf_bottom"] = State(25, "/parallel/behaviour/init_modelverse/logging_in_modelverse/register_conf_bottom", self)
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/register_conf_bottom"].setEnter(self._parallel_behaviour_init_modelverse_logging_in_modelverse_register_conf_bottom_enter)
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/register_conf_bottom"].setEnter(self._parallel_behaviour_init_modelverse_logging_in_modelverse_register_conf_bottom_enter)
         
         
         # state /parallel/behaviour/init_modelverse/wait_close_splash
         # state /parallel/behaviour/init_modelverse/wait_close_splash
-        self.states["/parallel/behaviour/init_modelverse/wait_close_splash"] = State(24, "/parallel/behaviour/init_modelverse/wait_close_splash", self)
+        self.states["/parallel/behaviour/init_modelverse/wait_close_splash"] = State(26, "/parallel/behaviour/init_modelverse/wait_close_splash", self)
         self.states["/parallel/behaviour/init_modelverse/wait_close_splash"].setEnter(self._parallel_behaviour_init_modelverse_wait_close_splash_enter)
         self.states["/parallel/behaviour/init_modelverse/wait_close_splash"].setEnter(self._parallel_behaviour_init_modelverse_wait_close_splash_enter)
         self.states["/parallel/behaviour/init_modelverse/wait_close_splash"].setExit(self._parallel_behaviour_init_modelverse_wait_close_splash_exit)
         self.states["/parallel/behaviour/init_modelverse/wait_close_splash"].setExit(self._parallel_behaviour_init_modelverse_wait_close_splash_exit)
         
         
         # state /parallel/behaviour/init_modelverse/closing_splash
         # state /parallel/behaviour/init_modelverse/closing_splash
-        self.states["/parallel/behaviour/init_modelverse/closing_splash"] = State(25, "/parallel/behaviour/init_modelverse/closing_splash", self)
+        self.states["/parallel/behaviour/init_modelverse/closing_splash"] = State(27, "/parallel/behaviour/init_modelverse/closing_splash", self)
         self.states["/parallel/behaviour/init_modelverse/closing_splash"].setEnter(self._parallel_behaviour_init_modelverse_closing_splash_enter)
         self.states["/parallel/behaviour/init_modelverse/closing_splash"].setEnter(self._parallel_behaviour_init_modelverse_closing_splash_enter)
         
         
         # state /parallel/behaviour/init_main_window
         # state /parallel/behaviour/init_main_window
-        self.states["/parallel/behaviour/init_main_window"] = State(26, "/parallel/behaviour/init_main_window", self)
+        self.states["/parallel/behaviour/init_main_window"] = State(28, "/parallel/behaviour/init_main_window", self)
         self.states["/parallel/behaviour/init_main_window"].setEnter(self._parallel_behaviour_init_main_window_enter)
         self.states["/parallel/behaviour/init_main_window"].setEnter(self._parallel_behaviour_init_main_window_enter)
         
         
         # state /parallel/behaviour/main_behaviour
         # state /parallel/behaviour/main_behaviour
-        self.states["/parallel/behaviour/main_behaviour"] = State(27, "/parallel/behaviour/main_behaviour", self)
+        self.states["/parallel/behaviour/main_behaviour"] = State(29, "/parallel/behaviour/main_behaviour", self)
         
         
         # state /parallel/behaviour/stopped
         # state /parallel/behaviour/stopped
-        self.states["/parallel/behaviour/stopped"] = State(28, "/parallel/behaviour/stopped", self)
+        self.states["/parallel/behaviour/stopped"] = State(30, "/parallel/behaviour/stopped", self)
         self.states["/parallel/behaviour/stopped"].setEnter(self._parallel_behaviour_stopped_enter)
         self.states["/parallel/behaviour/stopped"].setEnter(self._parallel_behaviour_stopped_enter)
         
         
         # state /parallel/forward_requests
         # state /parallel/forward_requests
-        self.states["/parallel/forward_requests"] = State(29, "/parallel/forward_requests", self)
+        self.states["/parallel/forward_requests"] = State(31, "/parallel/forward_requests", self)
         
         
         # state /parallel/forward_requests/forward
         # state /parallel/forward_requests/forward
-        self.states["/parallel/forward_requests/forward"] = State(30, "/parallel/forward_requests/forward", self)
+        self.states["/parallel/forward_requests/forward"] = State(32, "/parallel/forward_requests/forward", self)
         
         
         # add children
         # add children
         self.states[""].addChild(self.states["/parallel"])
         self.states[""].addChild(self.states["/parallel"])
@@ -200,7 +210,9 @@ class MainApp(RuntimeClassBase):
         self.states["/parallel/behaviour/init_modelverse/conversing/execute_OP"].addChild(self.states["/parallel/behaviour/init_modelverse/conversing/execute_OP/wait_model"])
         self.states["/parallel/behaviour/init_modelverse/conversing/execute_OP"].addChild(self.states["/parallel/behaviour/init_modelverse/conversing/execute_OP/wait_model"])
         self.states["/parallel/behaviour/init_modelverse/conversing/execute_OP"].addChild(self.states["/parallel/behaviour/init_modelverse/conversing/execute_OP/wait_subprocess"])
         self.states["/parallel/behaviour/init_modelverse/conversing/execute_OP"].addChild(self.states["/parallel/behaviour/init_modelverse/conversing/execute_OP/wait_subprocess"])
         self.states["/parallel/behaviour/init_modelverse/conversing/execute_OP"].addChild(self.states["/parallel/behaviour/init_modelverse/conversing/execute_OP/stopping"])
         self.states["/parallel/behaviour/init_modelverse/conversing/execute_OP"].addChild(self.states["/parallel/behaviour/init_modelverse/conversing/execute_OP/stopping"])
-        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC"].addChild(self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/spawn_chatwindow"])
+        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC"].addChild(self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/spawn"])
+        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC"].addChild(self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess"])
+        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC"].addChild(self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/stopping"])
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse"].addChild(self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/prompt_username"])
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse"].addChild(self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/prompt_username"])
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse"].addChild(self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials"])
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse"].addChild(self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials"])
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse"].addChild(self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/login"])
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse"].addChild(self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/login"])
@@ -214,7 +226,7 @@ class MainApp(RuntimeClassBase):
         self.states["/parallel/behaviour/init_modelverse"].default_state = self.states["/parallel/behaviour/init_modelverse/splash"]
         self.states["/parallel/behaviour/init_modelverse"].default_state = self.states["/parallel/behaviour/init_modelverse/splash"]
         self.states["/parallel/behaviour/init_modelverse/conversing"].default_state = self.states["/parallel/behaviour/init_modelverse/conversing/remove_splash"]
         self.states["/parallel/behaviour/init_modelverse/conversing"].default_state = self.states["/parallel/behaviour/init_modelverse/conversing/remove_splash"]
         self.states["/parallel/behaviour/init_modelverse/conversing/execute_OP"].default_state = self.states["/parallel/behaviour/init_modelverse/conversing/execute_OP/wait_model"]
         self.states["/parallel/behaviour/init_modelverse/conversing/execute_OP"].default_state = self.states["/parallel/behaviour/init_modelverse/conversing/execute_OP/wait_model"]
-        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC"].default_state = self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/spawn_chatwindow"]
+        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC"].default_state = self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/spawn"]
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse"].default_state = self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/prompt_username"]
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse"].default_state = self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/prompt_username"]
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials"].default_state = self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials/responsive"]
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials"].default_state = self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials/responsive"]
         self.states["/parallel/forward_requests"].default_state = self.states["/parallel/forward_requests/forward"]
         self.states["/parallel/forward_requests"].default_state = self.states["/parallel/forward_requests/forward"]
@@ -244,7 +256,6 @@ class MainApp(RuntimeClassBase):
         _parallel_behaviour_init_modelverse_initializing_modelverse_0.setGuard(self._parallel_behaviour_init_modelverse_initializing_modelverse_0_guard)
         _parallel_behaviour_init_modelverse_initializing_modelverse_0.setGuard(self._parallel_behaviour_init_modelverse_initializing_modelverse_0_guard)
         self.states["/parallel/behaviour/init_modelverse/initializing_modelverse"].addTransition(_parallel_behaviour_init_modelverse_initializing_modelverse_0)
         self.states["/parallel/behaviour/init_modelverse/initializing_modelverse"].addTransition(_parallel_behaviour_init_modelverse_initializing_modelverse_0)
         _parallel_behaviour_init_modelverse_initializing_modelverse_1 = Transition(self, self.states["/parallel/behaviour/init_modelverse/initializing_modelverse"], [self.states["/parallel/behaviour/init_modelverse/conversing"]])
         _parallel_behaviour_init_modelverse_initializing_modelverse_1 = Transition(self, self.states["/parallel/behaviour/init_modelverse/initializing_modelverse"], [self.states["/parallel/behaviour/init_modelverse/conversing"]])
-        _parallel_behaviour_init_modelverse_initializing_modelverse_1.setAction(self._parallel_behaviour_init_modelverse_initializing_modelverse_1_exec)
         _parallel_behaviour_init_modelverse_initializing_modelverse_1.setTrigger(Event("mv_response", None))
         _parallel_behaviour_init_modelverse_initializing_modelverse_1.setTrigger(Event("mv_response", None))
         _parallel_behaviour_init_modelverse_initializing_modelverse_1.setGuard(self._parallel_behaviour_init_modelverse_initializing_modelverse_1_guard)
         _parallel_behaviour_init_modelverse_initializing_modelverse_1.setGuard(self._parallel_behaviour_init_modelverse_initializing_modelverse_1_guard)
         self.states["/parallel/behaviour/init_modelverse/initializing_modelverse"].addTransition(_parallel_behaviour_init_modelverse_initializing_modelverse_1)
         self.states["/parallel/behaviour/init_modelverse/initializing_modelverse"].addTransition(_parallel_behaviour_init_modelverse_initializing_modelverse_1)
@@ -286,15 +297,39 @@ class MainApp(RuntimeClassBase):
         _parallel_behaviour_init_modelverse_conversing_execute_OP_stopping_0.setTrigger(Event("_1after"))
         _parallel_behaviour_init_modelverse_conversing_execute_OP_stopping_0.setTrigger(Event("_1after"))
         self.states["/parallel/behaviour/init_modelverse/conversing/execute_OP/stopping"].addTransition(_parallel_behaviour_init_modelverse_conversing_execute_OP_stopping_0)
         self.states["/parallel/behaviour/init_modelverse/conversing/execute_OP/stopping"].addTransition(_parallel_behaviour_init_modelverse_conversing_execute_OP_stopping_0)
         
         
-        # transition /parallel/behaviour/init_modelverse/conversing/execute_SC/spawn_chatwindow
-        _parallel_behaviour_init_modelverse_conversing_execute_SC_spawn_chatwindow_0 = Transition(self, self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/spawn_chatwindow"], [self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/spawn_chatwindow"]])
-        _parallel_behaviour_init_modelverse_conversing_execute_SC_spawn_chatwindow_0.setAction(self._parallel_behaviour_init_modelverse_conversing_execute_SC_spawn_chatwindow_0_exec)
-        _parallel_behaviour_init_modelverse_conversing_execute_SC_spawn_chatwindow_0.setTrigger(Event("instance_created", None))
-        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/spawn_chatwindow"].addTransition(_parallel_behaviour_init_modelverse_conversing_execute_SC_spawn_chatwindow_0)
-        _parallel_behaviour_init_modelverse_conversing_execute_SC_spawn_chatwindow_1 = Transition(self, self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/spawn_chatwindow"], [self.states["/parallel/behaviour/stopped"]])
-        _parallel_behaviour_init_modelverse_conversing_execute_SC_spawn_chatwindow_1.setAction(self._parallel_behaviour_init_modelverse_conversing_execute_SC_spawn_chatwindow_1_exec)
-        _parallel_behaviour_init_modelverse_conversing_execute_SC_spawn_chatwindow_1.setTrigger(Event("delete_me", None))
-        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/spawn_chatwindow"].addTransition(_parallel_behaviour_init_modelverse_conversing_execute_SC_spawn_chatwindow_1)
+        # transition /parallel/behaviour/init_modelverse/conversing/execute_SC/spawn
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_spawn_0 = Transition(self, self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/spawn"], [self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess"]])
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_spawn_0.setAction(self._parallel_behaviour_init_modelverse_conversing_execute_SC_spawn_0_exec)
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_spawn_0.setTrigger(None)
+        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/spawn"].addTransition(_parallel_behaviour_init_modelverse_conversing_execute_SC_spawn_0)
+        
+        # transition /parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_0 = Transition(self, self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess"], [self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess"]])
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_0.setAction(self._parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_0_exec)
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_0.setTrigger(Event("mv_data_output", None))
+        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess"].addTransition(_parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_0)
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_1 = Transition(self, self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess"], [self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess"]])
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_1.setAction(self._parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_1_exec)
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_1.setTrigger(None)
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_1.setGuard(self._parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_1_guard)
+        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess"].addTransition(_parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_1)
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_2 = Transition(self, self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess"], [self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/stopping"]])
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_2.setAction(self._parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_2_exec)
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_2.setTrigger(Event("mv_response", None))
+        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess"].addTransition(_parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_2)
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_3 = Transition(self, self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess"], [self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/stopping"]])
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_3.setAction(self._parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_3_exec)
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_3.setTrigger(None)
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_3.setGuard(self._parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_3_guard)
+        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess"].addTransition(_parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_3)
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_4 = Transition(self, self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess"], [self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess"]])
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_4.setTrigger(Event("_2after"))
+        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess"].addTransition(_parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_4)
+        
+        # transition /parallel/behaviour/init_modelverse/conversing/execute_SC/stopping
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_stopping_0 = Transition(self, self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/stopping"], [self.states["/parallel/behaviour/stopped"]])
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_stopping_0.setTrigger(Event("_3after"))
+        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/stopping"].addTransition(_parallel_behaviour_init_modelverse_conversing_execute_SC_stopping_0)
         
         
         # transition /parallel/behaviour/init_modelverse/logging_in_modelverse/prompt_username
         # transition /parallel/behaviour/init_modelverse/logging_in_modelverse/prompt_username
         _parallel_behaviour_init_modelverse_logging_in_modelverse_prompt_username_0 = Transition(self, self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/prompt_username"], [self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials"]])
         _parallel_behaviour_init_modelverse_logging_in_modelverse_prompt_username_0 = Transition(self, self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/prompt_username"], [self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials"]])
@@ -338,7 +373,7 @@ class MainApp(RuntimeClassBase):
         
         
         # transition /parallel/behaviour/init_modelverse/wait_close_splash
         # transition /parallel/behaviour/init_modelverse/wait_close_splash
         _parallel_behaviour_init_modelverse_wait_close_splash_0 = Transition(self, self.states["/parallel/behaviour/init_modelverse/wait_close_splash"], [self.states["/parallel/behaviour/init_modelverse/closing_splash"]])
         _parallel_behaviour_init_modelverse_wait_close_splash_0 = Transition(self, self.states["/parallel/behaviour/init_modelverse/wait_close_splash"], [self.states["/parallel/behaviour/init_modelverse/closing_splash"]])
-        _parallel_behaviour_init_modelverse_wait_close_splash_0.setTrigger(Event("_2after"))
+        _parallel_behaviour_init_modelverse_wait_close_splash_0.setTrigger(Event("_4after"))
         self.states["/parallel/behaviour/init_modelverse/wait_close_splash"].addTransition(_parallel_behaviour_init_modelverse_wait_close_splash_0)
         self.states["/parallel/behaviour/init_modelverse/wait_close_splash"].addTransition(_parallel_behaviour_init_modelverse_wait_close_splash_0)
         
         
         # transition /parallel/behaviour/init_modelverse/closing_splash
         # transition /parallel/behaviour/init_modelverse/closing_splash
@@ -384,9 +419,6 @@ class MainApp(RuntimeClassBase):
         _parallel_forward_requests_forward_5.setTrigger(Event("data_output", None))
         _parallel_forward_requests_forward_5.setTrigger(Event("data_output", None))
         self.states["/parallel/forward_requests/forward"].addTransition(_parallel_forward_requests_forward_5)
         self.states["/parallel/forward_requests/forward"].addTransition(_parallel_forward_requests_forward_5)
     
     
-    def _parallel_behaviour_init_modelverse_conversing_execute_SC_enter(self):
-        self.big_step.outputEventOM(Event("create_instance", None, [self, 'windows', 'ChatWindow']))
-    
     def _parallel_behaviour_init_modelverse_logging_in_modelverse_wait_for_credentials_exit(self):
     def _parallel_behaviour_init_modelverse_logging_in_modelverse_wait_for_credentials_exit(self):
         self.big_step.outputEventOM(Event("delete_instance", None, [self, self.prompt_window]))
         self.big_step.outputEventOM(Event("delete_instance", None, [self, self.prompt_window]))
     
     
@@ -419,6 +451,18 @@ class MainApp(RuntimeClassBase):
     def _parallel_behaviour_init_modelverse_conversing_execute_OP_stopping_exit(self):
     def _parallel_behaviour_init_modelverse_conversing_execute_OP_stopping_exit(self):
         self.removeTimer(1)
         self.removeTimer(1)
     
     
+    def _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_enter(self):
+        self.addTimer(2, 0.5)
+    
+    def _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_exit(self):
+        self.removeTimer(2)
+    
+    def _parallel_behaviour_init_modelverse_conversing_execute_SC_stopping_enter(self):
+        self.addTimer(3, 2.0)
+    
+    def _parallel_behaviour_init_modelverse_conversing_execute_SC_stopping_exit(self):
+        self.removeTimer(3)
+    
     def _parallel_behaviour_init_modelverse_logging_in_modelverse_prompt_username_enter(self):
     def _parallel_behaviour_init_modelverse_logging_in_modelverse_prompt_username_enter(self):
         self.big_step.outputEventOM(Event("create_instance", None, [self, 'windows', 'PromptWindow', {'username': data['username'], 'password': data['password']}, {'password': {'show': '*'}}]))
         self.big_step.outputEventOM(Event("create_instance", None, [self, 'windows', 'PromptWindow', {'username': data['username'], 'password': data['password']}, {'password': {'show': '*'}}]))
     
     
@@ -433,10 +477,10 @@ class MainApp(RuntimeClassBase):
         self.raiseInternalEvent(Event("mv_request", None, ['alter_context', ['formalisms/Bottom', 'formalisms/SimpleClassDiagrams']]))
         self.raiseInternalEvent(Event("mv_request", None, ['alter_context', ['formalisms/Bottom', 'formalisms/SimpleClassDiagrams']]))
     
     
     def _parallel_behaviour_init_modelverse_wait_close_splash_enter(self):
     def _parallel_behaviour_init_modelverse_wait_close_splash_enter(self):
-        self.addTimer(2, 0.0)
+        self.addTimer(4, 0.0)
     
     
     def _parallel_behaviour_init_modelverse_wait_close_splash_exit(self):
     def _parallel_behaviour_init_modelverse_wait_close_splash_exit(self):
-        self.removeTimer(2)
+        self.removeTimer(4)
     
     
     def _parallel_behaviour_init_modelverse_closing_splash_enter(self):
     def _parallel_behaviour_init_modelverse_closing_splash_enter(self):
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.splash_window, Event("close", None, [])]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.splash_window, Event("close", None, [])]))
@@ -466,9 +510,6 @@ class MainApp(RuntimeClassBase):
     def _parallel_behaviour_init_modelverse_initializing_modelverse_0_guard(self, parameters):
     def _parallel_behaviour_init_modelverse_initializing_modelverse_0_guard(self, parameters):
         return data['taskname'] is None
         return data['taskname'] is None
     
     
-    def _parallel_behaviour_init_modelverse_initializing_modelverse_1_exec(self, parameters):
-        self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.splash_window, Event("update_status", None, [40, 'Waiting for Modelverse initialization... OK'])]))
-    
     def _parallel_behaviour_init_modelverse_initializing_modelverse_1_guard(self, parameters):
     def _parallel_behaviour_init_modelverse_initializing_modelverse_1_guard(self, parameters):
         return data['taskname'] is not None
         return data['taskname'] is not None
     
     
@@ -494,13 +535,42 @@ class MainApp(RuntimeClassBase):
     def _parallel_behaviour_init_modelverse_conversing_execute_OP_wait_subprocess_0_guard(self, parameters):
     def _parallel_behaviour_init_modelverse_conversing_execute_OP_wait_subprocess_0_guard(self, parameters):
         return self.subprocess.poll() is not None
         return self.subprocess.poll() is not None
     
     
-    def _parallel_behaviour_init_modelverse_conversing_execute_SC_spawn_chatwindow_0_exec(self, parameters):
-        assoc_name = parameters[0]
-        self.big_step.outputEventOM(Event("start_instance", None, [self, assoc_name]))
-        self.big_step.outputEventOM(Event("narrow_cast", None, [self, assoc_name, Event("assoc_name", None, [assoc_name])]))
+    def _parallel_behaviour_init_modelverse_conversing_execute_SC_spawn_0_exec(self, parameters):
+        self.subprocess = subprocess.Popen(data['spawn'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
+        
+        # If you are using Windows, then this ugly code is for you!
+        # Windows does not allow asynchronous reading of stdin and stdout, so we have to mess around with threads.
+        # Interestingly, threads don't work well with SCCD, so this is a gamble.
+        # On UNIX systems, a simple "select" statement would have sufficed in the SCCD condition, but Windows doesn't like elegant solutions...
+        def enqueue_output(out, queue):
+            for line in iter(out.readline, b''):
+                queue.append(line)
+            out.close()
+        
+        self.output_queue = []
+        p = threading.Thread(target=enqueue_output, arguments=[self.subprocess.stdout, self.output_queue])
+        p.daemon = True
+        p.start()
+    
+    def _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_0_exec(self, parameters):
+        value = parameters[0]
+        # Send data to the spawned subprocess
+        self.subprocess.stdin.write(value)
     
     
-    def _parallel_behaviour_init_modelverse_conversing_execute_SC_spawn_chatwindow_1_exec(self, parameters):
-        sys.exit(0)
+    def _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_1_exec(self, parameters):
+        self.raiseInternalEvent(Event("mv_data_input", None, [self.output_queue.pop(0), None]))
+    
+    def _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_1_guard(self, parameters):
+        return self.output_queue
+    
+    def _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_2_exec(self, parameters):
+        self.subprocess.terminate()
+    
+    def _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_3_exec(self, parameters):
+        print("Finished execution of activity!")
+    
+    def _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_3_guard(self, parameters):
+        return self.subprocess.poll() is not None
     
     
     def _parallel_behaviour_init_modelverse_logging_in_modelverse_prompt_username_0_exec(self, parameters):
     def _parallel_behaviour_init_modelverse_logging_in_modelverse_prompt_username_0_exec(self, parameters):
         association_name = parameters[0]
         association_name = parameters[0]
@@ -8064,7 +8134,6 @@ class ActivityExecutor(RuntimeClassBase, tk.Toplevel, SCCDWidget):
     def _all_all_execute_alter_context_result_add_enter(self):
     def _all_all_execute_alter_context_result_add_enter(self):
         tag, model = self.exec_output_signature.popitem()
         tag, model = self.exec_output_signature.popitem()
         metamodel = self.output_signature[tag]
         metamodel = self.output_signature[tag]
-        print("Setting context for " + str((model, metamodel)))
         self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['alter_context', [model, metamodel]])]))
         self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['alter_context', [model, metamodel]])]))
     
     
     def _all_all_browse_activity_create_browser_enter(self):
     def _all_all_browse_activity_create_browser_enter(self):
@@ -8195,7 +8264,7 @@ class ActivityExecutor(RuntimeClassBase, tk.Toplevel, SCCDWidget):
     
     
     def _all_all_execute_execute_0_exec(self, parameters):
     def _all_all_execute_execute_0_exec(self, parameters):
         taskname = parameters[0]
         taskname = parameters[0]
-        subprocess.Popen([sys.executable, sys.argv[0], "--address", data['mv_address'], "--username", data['username'], "--password", data['password'], "--taskname", taskname])
+        self.subprocess = subprocess.Popen([sys.executable, sys.argv[0], "--address", data['mv_address'], "--username", data['username'], "--password", data['password'], "--taskname", taskname, "--spawn", "run_chatwindow.py"])
     
     
     def _all_all_execute_alter_context_result_check_next_0_guard(self, parameters):
     def _all_all_execute_alter_context_result_check_next_0_guard(self, parameters):
         return self.exec_output_signature
         return self.exec_output_signature
@@ -8932,7 +9001,7 @@ class ProcessEnactor(RuntimeClassBase, tk.Toplevel, SCCDWidget):
     def _all_all_execute_in_context_1_exec(self, parameters):
     def _all_all_execute_in_context_1_exec(self, parameters):
         result = parameters[0]
         result = parameters[0]
         taskname, operation = result
         taskname, operation = result
-        subprocess.Popen([sys.executable, sys.argv[0], "--address", data['mv_address'], "--username", data['username'], "--password", data['password'], "--taskname", taskname])
+        subprocess.Popen([sys.executable, sys.argv[0], "--address", data['mv_address'], "--username", data['username'], "--password", data['password'], "--taskname", taskname, "--spawn", "run_chatwindow.py"])
     
     
     def _all_all_execute_in_context_1_guard(self, parameters):
     def _all_all_execute_in_context_1_guard(self, parameters):
         result = parameters[0]
         result = parameters[0]
@@ -10203,7 +10272,6 @@ class ChatWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         tk.Toplevel.__init__(self)
         tk.Toplevel.__init__(self)
         SCCDWidget.__init__(self)
         SCCDWidget.__init__(self)
         self.input_value = ""
         self.input_value = ""
-        print("Start up chatwindow!")
     
     
     def user_defined_destructor(self):
     def user_defined_destructor(self):
         self.destroy()
         self.destroy()
@@ -10220,54 +10288,50 @@ class ChatWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         # state <root>
         # state <root>
         self.states[""] = State(0, "", self)
         self.states[""] = State(0, "", self)
         
         
-        # state /get_assoc_name
-        self.states["/get_assoc_name"] = State(1, "/get_assoc_name", self)
-        
         # state /init
         # state /init
-        self.states["/init"] = State(2, "/init", self)
+        self.states["/init"] = State(1, "/init", self)
         
         
         # state /init/init_entry_log
         # state /init/init_entry_log
-        self.states["/init/init_entry_log"] = State(3, "/init/init_entry_log", self)
+        self.states["/init/init_entry_log"] = State(2, "/init/init_entry_log", self)
         
         
         # state /init/init_entry_log/create
         # state /init/init_entry_log/create
-        self.states["/init/init_entry_log/create"] = State(4, "/init/init_entry_log/create", self)
+        self.states["/init/init_entry_log/create"] = State(3, "/init/init_entry_log/create", self)
         self.states["/init/init_entry_log/create"].setEnter(self._init_init_entry_log_create_enter)
         self.states["/init/init_entry_log/create"].setEnter(self._init_init_entry_log_create_enter)
         
         
         # state /init/init_entry_log/wait_for_packing
         # state /init/init_entry_log/wait_for_packing
-        self.states["/init/init_entry_log/wait_for_packing"] = State(5, "/init/init_entry_log/wait_for_packing", self)
+        self.states["/init/init_entry_log/wait_for_packing"] = State(4, "/init/init_entry_log/wait_for_packing", self)
         
         
         # state /init/init_entry_input
         # state /init/init_entry_input
-        self.states["/init/init_entry_input"] = State(6, "/init/init_entry_input", self)
+        self.states["/init/init_entry_input"] = State(5, "/init/init_entry_input", self)
         
         
         # state /init/init_entry_input/create
         # state /init/init_entry_input/create
-        self.states["/init/init_entry_input/create"] = State(7, "/init/init_entry_input/create", self)
+        self.states["/init/init_entry_input/create"] = State(6, "/init/init_entry_input/create", self)
         self.states["/init/init_entry_input/create"].setEnter(self._init_init_entry_input_create_enter)
         self.states["/init/init_entry_input/create"].setEnter(self._init_init_entry_input_create_enter)
         
         
         # state /init/init_entry_input/wait_for_packing
         # state /init/init_entry_input/wait_for_packing
-        self.states["/init/init_entry_input/wait_for_packing"] = State(8, "/init/init_entry_input/wait_for_packing", self)
+        self.states["/init/init_entry_input/wait_for_packing"] = State(7, "/init/init_entry_input/wait_for_packing", self)
         
         
         # state /init/init_button_send
         # state /init/init_button_send
-        self.states["/init/init_button_send"] = State(9, "/init/init_button_send", self)
+        self.states["/init/init_button_send"] = State(8, "/init/init_button_send", self)
         
         
         # state /init/init_button_send/create
         # state /init/init_button_send/create
-        self.states["/init/init_button_send/create"] = State(10, "/init/init_button_send/create", self)
+        self.states["/init/init_button_send/create"] = State(9, "/init/init_button_send/create", self)
         self.states["/init/init_button_send/create"].setEnter(self._init_init_button_send_create_enter)
         self.states["/init/init_button_send/create"].setEnter(self._init_init_button_send_create_enter)
         
         
         # state /init/init_button_send/wait_for_packing
         # state /init/init_button_send/wait_for_packing
-        self.states["/init/init_button_send/wait_for_packing"] = State(11, "/init/init_button_send/wait_for_packing", self)
+        self.states["/init/init_button_send/wait_for_packing"] = State(10, "/init/init_button_send/wait_for_packing", self)
         
         
         # state /root
         # state /root
-        self.states["/root"] = State(12, "/root", self)
+        self.states["/root"] = State(11, "/root", self)
         
         
         # state /closing
         # state /closing
-        self.states["/closing"] = State(13, "/closing", self)
+        self.states["/closing"] = State(12, "/closing", self)
         self.states["/closing"].setEnter(self._closing_enter)
         self.states["/closing"].setEnter(self._closing_enter)
         
         
         # state /close
         # state /close
-        self.states["/close"] = State(14, "/close", self)
+        self.states["/close"] = State(13, "/close", self)
         
         
         # add children
         # add children
-        self.states[""].addChild(self.states["/get_assoc_name"])
         self.states[""].addChild(self.states["/init"])
         self.states[""].addChild(self.states["/init"])
         self.states[""].addChild(self.states["/root"])
         self.states[""].addChild(self.states["/root"])
         self.states[""].addChild(self.states["/closing"])
         self.states[""].addChild(self.states["/closing"])
@@ -10282,18 +10346,12 @@ class ChatWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.states["/init/init_button_send"].addChild(self.states["/init/init_button_send/create"])
         self.states["/init/init_button_send"].addChild(self.states["/init/init_button_send/create"])
         self.states["/init/init_button_send"].addChild(self.states["/init/init_button_send/wait_for_packing"])
         self.states["/init/init_button_send"].addChild(self.states["/init/init_button_send/wait_for_packing"])
         self.states[""].fixTree()
         self.states[""].fixTree()
-        self.states[""].default_state = self.states["/get_assoc_name"]
+        self.states[""].default_state = self.states["/init"]
         self.states["/init"].default_state = self.states["/init/init_entry_log"]
         self.states["/init"].default_state = self.states["/init/init_entry_log"]
         self.states["/init/init_entry_log"].default_state = self.states["/init/init_entry_log/create"]
         self.states["/init/init_entry_log"].default_state = self.states["/init/init_entry_log/create"]
         self.states["/init/init_entry_input"].default_state = self.states["/init/init_entry_input/create"]
         self.states["/init/init_entry_input"].default_state = self.states["/init/init_entry_input/create"]
         self.states["/init/init_button_send"].default_state = self.states["/init/init_button_send/create"]
         self.states["/init/init_button_send"].default_state = self.states["/init/init_button_send/create"]
         
         
-        # transition /get_assoc_name
-        _get_assoc_name_0 = Transition(self, self.states["/get_assoc_name"], [self.states["/init"]])
-        _get_assoc_name_0.setAction(self._get_assoc_name_0_exec)
-        _get_assoc_name_0.setTrigger(Event("assoc_name", None))
-        self.states["/get_assoc_name"].addTransition(_get_assoc_name_0)
-        
         # transition /init/init_entry_log/create
         # transition /init/init_entry_log/create
         _init_init_entry_log_create_0 = Transition(self, self.states["/init/init_entry_log/create"], [self.states["/init/init_entry_log/wait_for_packing"]])
         _init_init_entry_log_create_0 = Transition(self, self.states["/init/init_entry_log/create"], [self.states["/init/init_entry_log/wait_for_packing"]])
         _init_init_entry_log_create_0.setAction(self._init_init_entry_log_create_0_exec)
         _init_init_entry_log_create_0.setAction(self._init_init_entry_log_create_0_exec)
@@ -10338,7 +10396,7 @@ class ChatWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.states["/root"].addTransition(_root_0)
         self.states["/root"].addTransition(_root_0)
         _root_1 = Transition(self, self.states["/root"], [self.states["/root"]])
         _root_1 = Transition(self, self.states["/root"], [self.states["/root"]])
         _root_1.setAction(self._root_1_exec)
         _root_1.setAction(self._root_1_exec)
-        _root_1.setTrigger(Event("mv_data_output", None))
+        _root_1.setTrigger(Event("stdin_input", "stdin_port"))
         self.states["/root"].addTransition(_root_1)
         self.states["/root"].addTransition(_root_1)
         _root_2 = Transition(self, self.states["/root"], [self.states["/root"]])
         _root_2 = Transition(self, self.states["/root"], [self.states["/root"]])
         _root_2.setAction(self._root_2_exec)
         _root_2.setAction(self._root_2_exec)
@@ -10346,15 +10404,11 @@ class ChatWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         _root_2.setGuard(self._root_2_guard)
         _root_2.setGuard(self._root_2_guard)
         self.states["/root"].addTransition(_root_2)
         self.states["/root"].addTransition(_root_2)
         _root_3 = Transition(self, self.states["/root"], [self.states["/closing"]])
         _root_3 = Transition(self, self.states["/root"], [self.states["/closing"]])
-        _root_3.setTrigger(Event("mv_response", None))
+        _root_3.setTrigger(Event("close_window", None))
         self.states["/root"].addTransition(_root_3)
         self.states["/root"].addTransition(_root_3)
-        _root_4 = Transition(self, self.states["/root"], [self.states["/closing"]])
-        _root_4.setTrigger(Event("close_window", None))
-        self.states["/root"].addTransition(_root_4)
         
         
         # transition /closing
         # transition /closing
         _closing_0 = Transition(self, self.states["/closing"], [self.states["/close"]])
         _closing_0 = Transition(self, self.states["/closing"], [self.states["/close"]])
-        _closing_0.setAction(self._closing_0_exec)
         _closing_0.setTrigger(Event("instance_deleted", None))
         _closing_0.setTrigger(Event("instance_deleted", None))
         self.states["/closing"].addTransition(_closing_0)
         self.states["/closing"].addTransition(_closing_0)
     
     
@@ -10371,10 +10425,6 @@ class ChatWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.big_step.outputEventOM(Event("delete_instance", None, [self, 'buttons']))
         self.big_step.outputEventOM(Event("delete_instance", None, [self, 'buttons']))
         self.big_step.outputEventOM(Event("delete_instance", None, [self, 'entries']))
         self.big_step.outputEventOM(Event("delete_instance", None, [self, 'entries']))
     
     
-    def _get_assoc_name_0_exec(self, parameters):
-        assoc_name = parameters[0]
-        self.assoc_name = assoc_name
-    
     def _init_init_entry_log_create_0_exec(self, parameters):
     def _init_init_entry_log_create_0_exec(self, parameters):
         association_name = parameters[0]
         association_name = parameters[0]
         self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
         self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
@@ -10404,8 +10454,7 @@ class ChatWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
     
     
     def _root_0_exec(self, parameters):
     def _root_0_exec(self, parameters):
         event_name = parameters[0]
         event_name = parameters[0]
-        self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_data_input", None, [self.input_value, None])]))
-        print("Sent data")
+        self.big_step.outputEvent(Event("stdout_output", "stdout_port", [self.input_value]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.entry_input, Event("change_value", None, [''])]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.entry_input, Event("change_value", None, [''])]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.entry_log, Event("append_value", None, ['< ' + self.input_value + '\n'])]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.entry_log, Event("append_value", None, ['< ' + self.input_value + '\n'])]))
     
     
@@ -10427,12 +10476,9 @@ class ChatWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         value = parameters[1]
         value = parameters[1]
         return name == 'input_value'
         return name == 'input_value'
     
     
-    def _closing_0_exec(self, parameters):
-        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("delete_me", None, [self.assoc_name])]))
-    
     def initializeStatechart(self):
     def initializeStatechart(self):
         # enter default state
         # enter default state
-        self.default_targets = self.states["/get_assoc_name"].getEffectiveTargetStates()
+        self.default_targets = self.states["/init"].getEffectiveTargetStates()
         RuntimeClassBase.initializeStatechart(self)
         RuntimeClassBase.initializeStatechart(self)
 
 
 class Toolbar(RuntimeClassBase, tk.Frame, SCCDWidget):
 class Toolbar(RuntimeClassBase, tk.Frame, SCCDWidget):
@@ -11440,7 +11486,6 @@ class Text(RuntimeClassBase):
     
     
     def _main_ready_0_exec(self, parameters):
     def _main_ready_0_exec(self, parameters):
         new_value = parameters[0]
         new_value = parameters[0]
-        print("Appending value")
         self.entry.config(state=tk.NORMAL)
         self.entry.config(state=tk.NORMAL)
         self.entry.insert(tk.END, new_value)
         self.entry.insert(tk.END, new_value)
         self.entry.config(state=tk.DISABLED)
         self.entry.config(state=tk.DISABLED)
@@ -11548,7 +11593,6 @@ class Entry(RuntimeClassBase):
         tagorid = parameters[0]
         tagorid = parameters[0]
         new_value = parameters[1]
         new_value = parameters[1]
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("changed_entry", None, [self.name, new_value])]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("changed_entry", None, [self.name, new_value])]))
-        print("Got entry change Tk event!")
     
     
     def _main_ready_0_guard(self, parameters):
     def _main_ready_0_guard(self, parameters):
         tagorid = parameters[0]
         tagorid = parameters[0]
@@ -11565,7 +11609,6 @@ class Entry(RuntimeClassBase):
     
     
     def _main_ready_3_exec(self, parameters):
     def _main_ready_3_exec(self, parameters):
         new_value = parameters[0]
         new_value = parameters[0]
-        print("CHANGE VALUE IN ENTRY")
         self.strvar.set(new_value)
         self.strvar.set(new_value)
     
     
     def _main_ready_4_exec(self, parameters):
     def _main_ready_4_exec(self, parameters):
@@ -13558,7 +13601,7 @@ class ObjectManager(ObjectManagerBase):
     
     
     def instantiate(self, class_name, construct_params):
     def instantiate(self, class_name, construct_params):
         if class_name == "MainApp":
         if class_name == "MainApp":
-            instance = MainApp(self.controller, construct_params[0], construct_params[1], construct_params[2], construct_params[3], construct_params[4], construct_params[5], construct_params[6])
+            instance = MainApp(self.controller, construct_params[0], construct_params[1], construct_params[2], construct_params[3], construct_params[4], construct_params[5], construct_params[6], construct_params[7])
             instance.associations = {}
             instance.associations = {}
             instance.associations["modelverse"] = Association("Modelverse", 1, 1)
             instance.associations["modelverse"] = Association("Modelverse", 1, 1)
             instance.associations["windows"] = Association("Window", 0, -1)
             instance.associations["windows"] = Association("Window", 0, -1)
@@ -13725,11 +13768,11 @@ class ObjectManager(ObjectManagerBase):
         return instance
         return instance
 
 
 class Controller(EventLoopControllerBase):
 class Controller(EventLoopControllerBase):
-    def __init__(self, root, location, username, password, model, limited_mode, taskname, event_loop_callbacks, finished_callback = None, behind_schedule_callback = None):
+    def __init__(self, root, location, username, password, model, limited_mode, taskname, spawn, event_loop_callbacks, finished_callback = None, behind_schedule_callback = None):
         if finished_callback == None: finished_callback = None
         if finished_callback == None: finished_callback = None
         if behind_schedule_callback == None: behind_schedule_callback = None
         if behind_schedule_callback == None: behind_schedule_callback = None
         EventLoopControllerBase.__init__(self, ObjectManager(self), event_loop_callbacks, finished_callback, behind_schedule_callback)
         EventLoopControllerBase.__init__(self, ObjectManager(self), event_loop_callbacks, finished_callback, behind_schedule_callback)
         self.addInputPort("input")
         self.addInputPort("input")
         self.addInputPort("socket_in")
         self.addInputPort("socket_in")
         self.addOutputPort("socket_out")
         self.addOutputPort("socket_out")
-        self.object_manager.createInstance("MainApp", [root, location, username, password, model, limited_mode, taskname])
+        self.object_manager.createInstance("MainApp", [root, location, username, password, model, limited_mode, taskname, spawn])

+ 2 - 0
run_chatwindow.py

@@ -1,3 +1,5 @@
+#!/bin/env python2
+
 import Tkinter as tk
 import Tkinter as tk
 import chatwindow
 import chatwindow
 from sccd.runtime.statecharts_core import Event
 from sccd.runtime.statecharts_core import Event

+ 5 - 3
runner.py

@@ -11,10 +11,11 @@ class Root(tk.Tk, SCCDWidget):
         tk.Tk.__init__(self)
         tk.Tk.__init__(self)
         SCCDWidget.__init__(self)
         SCCDWidget.__init__(self)
 
 
-def run_GUI(location, username, password, model, limited_mode, taskname):
+def run_GUI(location, username, password, model, limited_mode, taskname, spawn):
+    print("Running GUI with " + str(locals()))
     root = Root()
     root = Root()
     root.withdraw()
     root.withdraw()
-    controller = frontend.Controller(root, location, username, password, model, limited_mode, taskname, TkEventLoop(root))
+    controller = frontend.Controller(root, location, username, password, model, limited_mode, taskname, spawn, TkEventLoop(root))
     socket2event.boot_translation_service(controller)
     socket2event.boot_translation_service(controller)
 
 
     SCCDWidget.controller = controller
     SCCDWidget.controller = controller
@@ -29,7 +30,8 @@ if __name__ == '__main__':
     parser.add_argument("--model", default=None, type=str)
     parser.add_argument("--model", default=None, type=str)
     parser.add_argument("--limited", action="store_true")
     parser.add_argument("--limited", action="store_true")
     parser.add_argument("--taskname", default=None, type=str)
     parser.add_argument("--taskname", default=None, type=str)
+    parser.add_argument("--spawn", default=None, type=str)
 
 
     args = parser.parse_args()
     args = parser.parse_args()
 
 
-    run_GUI(args.address, args.username, args.password, args.model, args.limited, args.taskname)
+    run_GUI(args.address, args.username, args.password, args.model, args.limited, args.taskname, args.spawn)