|
@@ -0,0 +1,61 @@
|
|
|
+include "primitives.alh"
|
|
|
+include "utils.alh"
|
|
|
+
|
|
|
+Integer services = 0
|
|
|
+
|
|
|
+String function comm_newPort():
|
|
|
+ // Create a new username, though prefixed with __ to prevent execution: this is merely a communication port!
|
|
|
+ // The specified port needs an input and output queue, like ordinary users.
|
|
|
+ Element root
|
|
|
+ root = read_root()
|
|
|
+
|
|
|
+ // Initialize, but we know that __hierarchy is already taken!
|
|
|
+ String attempt
|
|
|
+ attempt = "__hierarchy"
|
|
|
+ while (dict_in(root, attempt)):
|
|
|
+ attempt = "__" + cast_v2s(get_taskname()) + "_" + cast_v2s(services)
|
|
|
+ services = services + 1
|
|
|
+
|
|
|
+ // Create queues
|
|
|
+ Element queues
|
|
|
+ queues = create_node()
|
|
|
+ dict_add(queues, "input", create_node())
|
|
|
+ dict_add(queues, "output", create_node())
|
|
|
+
|
|
|
+ // Make it visible
|
|
|
+ dict_add(root, attempt, queues)
|
|
|
+ return attempt!
|
|
|
+
|
|
|
+Boolean function comm_hasInput(comm : String):
|
|
|
+ // Check if there is any input on the specified pseudo-username
|
|
|
+ Element root
|
|
|
+ root = read_root()
|
|
|
+ return dict_in(root[comm]["input"], "value")!
|
|
|
+
|
|
|
+Void function comm_set(comm : String, value : Element):
|
|
|
+ // Set input to the specified service
|
|
|
+ // For the Mv, this is actually output!
|
|
|
+ Element root
|
|
|
+ root = read_root()
|
|
|
+
|
|
|
+ Element new
|
|
|
+ new = create_node()
|
|
|
+ dict_add(root[comm]["last_output"], "value", value)
|
|
|
+ dict_add(root[comm]["last_output"], "next", new)
|
|
|
+ dict_overwrite(root[comm], "last_output", new)
|
|
|
+
|
|
|
+ return!
|
|
|
+
|
|
|
+Element function comm_get(comm : String):
|
|
|
+ // Fetch input from the service
|
|
|
+ while (bool_not(comm_hasInput(comm))):
|
|
|
+ sleep(0.01)
|
|
|
+
|
|
|
+ // Return the value that we got
|
|
|
+ Element root
|
|
|
+ root = read_root()
|
|
|
+ Element value
|
|
|
+ value = root["input"]["value"]
|
|
|
+ dict_overwrite(root, "input", root["input"]["next"])
|
|
|
+
|
|
|
+ return value!
|