Browse Source

Added different scopes: narrow, broad, and local

Yentl Van Tendeloo 8 years ago
parent
commit
71cb0ffac6
1 changed files with 29 additions and 5 deletions
  1. 29 5
      models/SCCD_execute.alc

+ 29 - 5
models/SCCD_execute.alc

@@ -134,6 +134,8 @@ Void function start_class(model : Element, data : Element, class : String, ident
 	class_handle = create_node()
 	dict_add(class_handle, "type", class)
 	dict_add(class_handle, "ID", identifier)
+	dict_add(class_handle, "events", create_node())
+	dict_add(class_handle, "new_events", create_node())
 	dict_add(class_handle, "timers", create_node())
 	dict_add(data["classes"], class_handle["ID"], class_handle)
 
@@ -207,7 +209,7 @@ Element function get_enabled_transitions(model : Element, state : String, data :
 
 	event_names = create_node()
 	event_parameters = create_node()
-	events = set_copy(data["events"])
+	events = set_copy(data["classes"][data["current_class"]]["events"])
 	while (read_nr_out(events) > 0):
 		evt = set_pop(events)
 		evt_name = list_read(evt, 0)
@@ -300,8 +302,19 @@ Void function process_raised_event(model : Element, event : Element, parameter_a
 			String identifier
 			identifier = list_read(parameter_action, 0)
 			delete_class(model, data, identifier)
+	elif (scope == "broad"):
+		// Send to all classes
+		Element classes
+		classes = dict_keys(data["classes"])
+		while(read_nr_out(classes) > 0):
+			set_add(data["classes"][set_pop(classes)]["new_events"], create_tuple(read_attribute(model, event, "event"), parameter_action))
+	elif (scope == "narrow"):
+		// Send to the specified class only
+		// TODO some error checking would be nice...
+		set_add(data["classes"][read_attribute(model, event, "target")]["new_events"], create_tuple(read_attribute(model, event, "event"), parameter_action))
 	else:
-		set_add(data["events"], create_tuple(read_attribute(model, event, "event"), parameter_action))
+		// Same as local
+		set_add(data["classes"][data["current_class"]]["new_events"], create_tuple(read_attribute(model, event, "event"), parameter_action))
 
 	return !
 
@@ -709,15 +722,26 @@ Boolean function main(model : Element):
 			// Stop execution
 			return True!
 
-		dict_overwrite(data, "events", create_node())
 		if (element_neq(interrupt, read_root())):
-			// Got interrupt
-			set_add(data["events"], create_tuple(interrupt, read_root()))
+			// Send out, as otherwise the client doesn't get a dialog
 			output("Processed event, ready for more!")
 
 			// Update the simulated time to the time of interrupt
 			time_sim = time() - time_0
 
+		dict_overwrite(data, "new_events", create_node())
+		Element classes
+		classes = dict_keys(data["classes"])
+		while(read_nr_out(classes) > 0):
+			String class
+			class = set_pop(classes)
+			dict_overwrite(data["classes"][class], "events", data["classes"][class]["new_events"])
+			dict_overwrite(data["classes"][class], "new_events", create_node())
+
+			if (element_neq(interrupt, read_root())):
+				// Got interrupt, so append it already
+				set_add(data["classes"][class]["events"], create_tuple(interrupt, read_root()))
+
 		// Else we timeout, and thus keep the time_sim
 		dict_overwrite(data, "time_sim", time_sim)