فهرست منبع

SCCD uses instance_created and instance_deleted events

Yentl Van Tendeloo 8 سال پیش
والد
کامیت
04a2afdc72
2فایلهای تغییر یافته به همراه28 افزوده شده و 11 حذف شده
  1. 14 6
      models/SCCD_execute.alc
  2. 14 5
      models/dynamic_trafficlight.mvc

+ 14 - 6
models/SCCD_execute.alc

@@ -127,9 +127,13 @@ Void function delete_class(model : Element, data : Element, identifier : String)
 	// Stop a specific class instance, with attached statechart, from executing
 	dict_delete(data["classes"], identifier)
 
-Void function start_class(model : Element, data : Element, class : String, identifier : String, parameters : Element):
+String function start_class(model : Element, data : Element, class : String, parameters : Element):
 	// Start up the class and assign its initial state to it
 
+	// First find an empty identifier
+	String identifier
+	identifier = cast_i2s(dict_len(data["classes"]))
+
 	// Create the data structure for a running class
 	Element class_handle
 	class_handle = dict_create()
@@ -192,7 +196,7 @@ Void function start_class(model : Element, data : Element, class : String, ident
 	dict_overwrite(data, "current_class", prev_class)
 	dict_overwrite(data, "current_class_handle", data["classes"][prev_class])
 
-	return!
+	return identifier!
 
 Element function get_enabled_transitions(model : Element, state : String, data : Element):
 	// Returns all enabled transitions
@@ -295,16 +299,20 @@ Void function process_raised_event(model : Element, event : Element, parameter_a
 			String class
 			String identifier
 			Element parameters
-			class = set_pop(filter(model, allInstances(model, "SCCD/Class"), "name", list_read(parameter_action, 0)))
-			identifier = list_read(parameter_action, 1)
+			class = set_pop(filter(model, allInstances(model, "SCCD/Class"), "name", list_read(parameter_action, 1)))
 			parameters = list_read(parameter_action, 2)
-			start_class(model, data, class, identifier, parameters)
+			identifier = start_class(model, data, class, parameters)
+			Element lst
+			lst = list_create()
+			list_append(lst, identifier)
+			set_add_node(data["current_class_handle"]["new_events"], create_tuple("instance_created", lst))
 
 		elif (operation == "delete_instance"):
 			// Delete the requested class
 			String identifier
 			identifier = list_read(parameter_action, 0)
 			delete_class(model, data, identifier)
+			set_add_node(data["current_class_handle"]["new_events"], create_tuple("instance_deleted", parameter_action))
 	elif (scope == "broad"):
 		// Send to all classes
 		Element classes
@@ -714,7 +722,7 @@ Boolean function main(model : Element):
 	default_class = set_pop(filter(model, allInstances(model, "SCCD/Class"), "default", True))
 
 	// Start up the default class
-	start_class(model, data, default_class, "main", read_root())
+	start_class(model, data, default_class, read_root())
 
 	Float timeout
 	Element interrupt

+ 14 - 5
models/dynamic_trafficlight.mvc

@@ -10,7 +10,7 @@ Class manager {
     default = True
     constructor_body = $
             Void function constructor(attributes : Element, parameters : Element):
-                dict_add(attributes, "counter", 0)
+                dict_add(attributes, "trafficlights", list_create())
                 return !
         $
 
@@ -35,15 +35,25 @@ transition (manager_main_start, manager_main_start) {
                 Element function raise(attributes : Element, parameters : Element):
                     Element result
                     result = list_create()
+                    list_append(result, "trafficlights")
                     list_append(result, "TrafficLight")
-                    list_append(result, attributes["counter"])
                     list_append(result, read_root())
-                    dict_overwrite(attributes, "counter", integer_addition(attributes["counter"], 1))
                     return result!
             $
     }
 }
 
+transition (manager_main_start, manager_main_start) {
+    name = "created"
+    event = "instance_created"
+
+    script = $
+            Void function script(attributes : Element, parameters : Element):
+                list_append(attributes["trafficlights"], parameters[0])
+                return!
+        $
+}
+
 transition (manager_main_start, manager_main_start) {
     name = "delete"
     event = "delete"
@@ -55,8 +65,7 @@ transition (manager_main_start, manager_main_start) {
                 Element function raise(attributes : Element, parameters : Element):
                     Element result
                     result = list_create()
-                    dict_overwrite(attributes, "counter", integer_subtraction(attributes["counter"], 1))
-                    list_append(result, attributes["counter"])
+                    list_append(result, list_pop_final(attributes["trafficlights"]))
                     return result!
             $
     }