From 8dd8ed3a2deae70ceed1a3452491d4dbf2063ddf Mon Sep 17 00:00:00 2001
From: Susa Giogoli <su.giogoli@icloud.com>
Date: Mon, 10 Jul 2023 14:38:41 +0200
Subject: [PATCH] events can be generated on robot.json

---
 newmodeljsonparse.py | 76 ++++++++++++++++++++++++++++++--------------
 writefile.py         | 50 ++++++++++++++++++++++++++---
 2 files changed, 98 insertions(+), 28 deletions(-)

diff --git a/newmodeljsonparse.py b/newmodeljsonparse.py
index 5daea21..20cb058 100644
--- a/newmodeljsonparse.py
+++ b/newmodeljsonparse.py
@@ -4,14 +4,17 @@ import sys
 import writefile as wf
 from collections import namedtuple
 
+
 #creates the constructor for the measurement-object with corresponding parameters
 def measurementJsonDecod(measurementdict):
     return namedtuple('Measurement', measurementdict.keys())(*measurementdict.values())
 
+
 #creates the constructor for the parameter-object with corresponding parameters
 def parameterJsonDecod(parameterdict):
     return namedtuple('Parameter', parameterdict.keys())(*parameterdict.values())
 
+
 #creates the constructor for the function-object with corresponding parameters
 def functionJsonDecod(functiondict):
     return namedtuple('Function', functiondict.keys())(*functiondict.values())
@@ -32,6 +35,7 @@ class Measurement:
         else:
             self.value = value
 
+
 #Parameter class that can be instantiated using JsonDecod functions
 class Parameter:
     def __init__(self, name, description, datatype, dimension, value, rangevar=None, unit=None, default=None, constant=False):
@@ -60,8 +64,6 @@ class Parameter:
         #     self.value = self.datatype(default)
 
 
-
-
 #Function class that can be instantiated using JsonDecod functions
 class Function:
     def __init__(self, name, description, inargsdatatypes = None, outargsdatatypes = None):
@@ -71,7 +73,6 @@ class Function:
         self.outargsdatatypes = outargsdatatypes
 
 
-
 #switches the dimension into the right format
 def dimensionchange(string):
     dimarr = string["dimension"]
@@ -84,6 +85,7 @@ def dimensionchange(string):
         string.update(newdimension)
     return string
 
+
 #gets the datatypes of functions to set for opcua
 def getdatatypes(argarray):
     returnarr = []
@@ -94,6 +96,7 @@ def getdatatypes(argarray):
     else:
         return None
 
+
 #switches range into the right format
 def changerange(obj):
     if iskeythere(obj, "range"):
@@ -103,11 +106,13 @@ def changerange(obj):
         obj["range"] = [None, None]
     return obj
 
+
 def getunit(string):
     if not iskeythere(string, "unit"):
         string["unit"] = "UNITLESS"
     return string
 
+
 #gets the objectnames for arguments of the function
 def getobjnames(argarray):
     returnarr = []
@@ -119,6 +124,7 @@ def getobjnames(argarray):
     else:
         return None
 
+
 #returns a list of all the parameters as objects
 def getParameters(parametersDict):
     # extracts the measurements of a Json-Mode
@@ -133,10 +139,9 @@ def getParameters(parametersDict):
             obj = json.dumps(obj)
             parameterobji = json.loads(obj, object_hook=parameterJsonDecod)
             parameterobj.append(parameterobji)
-    print("parameterobj")
-    print(parameterobj)
     return parameterobj
 
+
 #returns a list of all the measurements as objects
 def getMeasurements(measurementsDict):
     measurementobj = []
@@ -153,13 +158,13 @@ def getMeasurements(measurementsDict):
             measurementobj.append(measurementobji)
     return measurementobj
 
+
 #returns a list of all the functions as objects
 def getFunctions(functionsDict, jsonmeasurements, jsonparameters):
     functionobj = []
     if len(functionsDict) > 0:
         for i in functionsDict:
             obj = i
-            # del obj["value"]
             arguments = searchlists(obj["arguments"], jsonmeasurements)
             arguments = arguments + searchlists(obj["arguments"], jsonparameters)
             returns = []
@@ -169,9 +174,6 @@ def getFunctions(functionsDict, jsonmeasurements, jsonparameters):
             obj["outargsnames"] = getobjnames(returns)
             obj["inargsdatatypes"] = getdatatypes(arguments)
             obj["outargsdatatypes"] = getdatatypes(returns)
-            #del obj["uuid"]
-            #del obj["arguments"]
-            #del obj["returns"]
             obj = json.dumps(obj)
             functionobji = json.loads(obj, object_hook=functionJsonDecod)
             functionobj.append(functionobji)
@@ -189,6 +191,7 @@ def searchlists(list1, list2):
                 objmeasurementlist.append(searchobj)
     return objmeasurementlist
 
+
 def getdefaultvalue(obj):
     if iskeythere(obj, "default"):
         if obj["datatype"] == "string" or obj["datatype"] == "enum":
@@ -214,7 +217,7 @@ def getdefaultvalue(obj):
 
 def iskeythere(list, key):
     for keysearch in list:
-        if(keysearch == key):
+        if keysearch == key:
             return True
     return False
 
@@ -223,7 +226,7 @@ def iteratingInterface(obj, dict, componentslist):
     if iskeythere(list(obj.keys()), "baseComponent"):
         for searchobj in componentslist:
             if searchobj["uuid"] == obj["baseComponent"]:
-                wf.writeinterface(componentslist[searchobj["name"]], searchobj["name"])
+                wf.writeinterface(componentslist[searchobj["name"]], searchobj["name"], 0)
 
 
 def getInterfaceparam(list1, interface, searched, jsoncomponents, searchinglist):
@@ -234,7 +237,18 @@ def getInterfaceparam(list1, interface, searched, jsoncomponents, searchinglist)
     if iskeythere(list(interface.keys()), "baseComponent"):
         for component in jsoncomponents:
             if component["uuid"] == interface["baseComponent"]:
-               return getInterfaceparam(list1, component, searched, jsoncomponents, searchinglist)
+                return getInterfaceparam(list1, component, searched, jsoncomponents, searchinglist)
+    else:
+        return list1
+
+
+def getVariables(list1, interface, jsoncomponents):
+    variablelist = interface["parameters"] + interface["measurements"]
+    list1 = list1 + variablelist
+    if iskeythere(list(interface.keys()), "baseComponent"):
+        for component in jsoncomponents:
+            if component["uuid"] == interface["baseComponent"]:
+                return getVariables(list1, component, jsoncomponents)
     else:
         return list1
 
@@ -250,8 +264,7 @@ def getEvents(list1, component, jsoncomponents):
         return list1
 
 
-
-def buildComponents(interfacesreturn, jsoninterfaces, jsoncomponents, jsonmeasurements, jsonparameters, jsonfunctions, objcomponentsclone):
+def buildComponents(interfacesreturn, variabledict, jsoninterfaces, jsoncomponents, jsonmeasurements, jsonparameters, jsonfunctions, objcomponentsclone):
     for obj in jsoninterfaces:
         rootobj = {}
         if obj["elementType"] == "interface":
@@ -269,14 +282,16 @@ def buildComponents(interfacesreturn, jsoninterfaces, jsoncomponents, jsonmeasur
             #print(objmeasurementlist)
             measurementsobjs = getMeasurements(objmeasurementlist)
             wf.writemeasurement(measurementsobjs, interfacesreturn[str(obj["name"])])
+            variablelist = getVariables([], rootobj, jsoncomponents)
+            variabledict[obj["uuid"]] = variablelist
             objparameterlist = getInterfaceparam([], rootobj, "parameters", jsoncomponents, jsonparameters)
             parameterobjs = getParameters(objparameterlist)
             wf.writeparameter(parameterobjs, interfacesreturn[str(obj["name"])])
             objfunctionlist = getInterfaceparam([], rootobj, "functions", jsoncomponents, jsonfunctions)
             functionobj = getFunctions(objfunctionlist, jsonparameters, jsonmeasurements)
             wf.writefunction(functionobj, interfacesreturn[str(obj["name"])])
-            buildComponents(interfacesreturn, objcomponentslist, jsoncomponents, jsonmeasurements, jsonparameters, jsonfunctions, objcomponentsclone)
-    return interfacesreturn
+            buildComponents(interfacesreturn, variabledict, objcomponentslist, jsoncomponents, jsonmeasurements, jsonparameters, jsonfunctions, objcomponentsclone)
+    return interfacesreturn, variabledict
 
 
 def instantiateComponents(typesdict, interfaces, jsoncomponents, headnode, instantiatedict, eventsdict):
@@ -288,10 +303,10 @@ def instantiateComponents(typesdict, interfaces, jsoncomponents, headnode, insta
             components = getInterfaceparam([], root, "components", jsoncomponents, jsoncomponents)
             if interface["name"] in list(instantiatedict.keys()):
                 count += 1
-            instantiatedict[str(interface["name"])] = wf.writeobjects(typesdict[str(interface["name"])], interface["name"], instantiatedict[str(headnode["name"])], count)
-            eventsdict[str(instantiatedict[str(interface["name"])])] = events
+            instantiatedict[str(interface["uuid"])] = wf.writeobjects(typesdict[str(interface["name"])], interface["name"], instantiatedict[str(headnode["uuid"])], count)
+            eventsdict[str(interface["uuid"])] = events
             if len(components) > 0:
-                instantiateComponents(typesdict,components , jsoncomponents, interface, instantiatedict, eventsdict)
+                instantiateComponents(typesdict, components, jsoncomponents, interface, instantiatedict, eventsdict)
 
         return instantiatedict, eventsdict
 
@@ -307,8 +322,8 @@ def instantiate(typesdict, interfaces, jsoncomponents):
                 root = component
         events = getEvents([], root, jsoncomponents)
         components = getInterfaceparam([], root, "components", jsoncomponents, jsoncomponents)
-        instantiatedict[str(interface["name"])] = wf.writeinterface(typesdict[str(interface["name"])], interface["name"], count)
-        eventsdict[str(instantiatedict[str(interface["name"])])] = events
+        instantiatedict[str(interface["uuid"])] = wf.writeinterface(typesdict[str(interface["name"])], interface["name"], count)
+        eventsdict[str(interface["uuid"])] = events
         return instantiateComponents(typesdict, components, jsoncomponents, interface, instantiatedict, eventsdict)
 
 
@@ -349,13 +364,26 @@ def main():
        
             elif obj["elementType"] == "enum":
                 jsonenums.append(obj)
-        typesdict = buildComponents({}, jsoninterfaces, jsoncomponents, jsonmeasurements, jsonparameters, jsonfunctions, [])
+        returnComponents = buildComponents({}, {}, jsoninterfaces, jsoncomponents, jsonmeasurements, jsonparameters, jsonfunctions, [])
+        typesdict = returnComponents[0]
+        variabledict = returnComponents[1]
+        print("Variabledict: ")
+        print(variabledict)
         returnval = instantiate(typesdict, jsoninterfaces, jsoncomponents)
         instantiatedict = returnval[0]
         eventsdict = returnval[1]
+        print("Instantiatedict: ")
+        print(instantiatedict)
+        print("Eventsdict: ")
         print(eventsdict)
-
-        wf.writend()
+        generatordict = {}
+        for key in list(eventsdict.keys()):
+            eventlist = wf.writeevents(eventsdict[key], instantiatedict[key], {}, {})
+            generatordict.update(eventlist)
+        wf.writendpt1()
+        for key in list(eventsdict.keys()):
+            wf.triggerevents(generatordict, eventsdict[key], instantiatedict[key], variabledict[key], jsonmeasurements, jsonparameters)
+        wf.writendpt2()
 
 
 if __name__ == '__main__':
diff --git a/writefile.py b/writefile.py
index 00a9427..2fda739 100644
--- a/writefile.py
+++ b/writefile.py
@@ -200,9 +200,19 @@ def writeinterface(objtype, objname, count):
     return objtypename
 
 
-def writeevents(events, component):
+def writeevents(events, component, eventlist, eventgenlist):
     server = open("opcua-server.py", "a")
-    server.write(")
+    writeindent = "    "
+    #eventelements = []
+    for event in events:
+        #eventelements.append(event["element"])
+        eventname = (event["element"].lower()).replace(" ", "") + component + str(event["severity"])
+        eventgenname = eventname + "generator"
+        eventlist[eventname] = eventgenname
+        #print(eventname)
+        server.write(writeindent + eventname + " = await server.create_custom_event_type(idx, \"" + str(event["element"]) + " " + str(event["severity"]) + "\", ua.ObjectIds.SystemEventType)\n")
+        server.write(writeindent + str(eventlist[eventname]) + " = await server.get_event_generator(" + eventname + ", " + component + ")\n")
+    return eventlist
 
 
 def writendpt1():
@@ -212,9 +222,40 @@ def writendpt1():
         print("Server is running!")
         count = 0
         
-        while True:
-        """)
+        while True:\n""")
+
 
+def triggerevents(generatordict, eventslist, component, variablelist, jsonmeasurements, jsonparameters):
+    server = open("opcua-server.py", "a")
+    indent = 3
+    print(variablelist)
+    for event in eventslist:
+        eventsearchname = ""
+        for variable in variablelist:
+            if variable["name"] == event["element"]:
+                for measurement in jsonmeasurements:
+                    if variable["value"] == measurement["uuid"]:
+                        eventsearchname = measurement["name"]
+                for parameter in jsonparameters:
+                    if variable["value"] == parameter["uuid"]:
+                        eventsearchname = parameter["name"]
+
+        writeindent = ""
+        for i in range(indent):
+            writeindent += "    "
+        dictname = (event["element"].lower()).replace(" ", "") + component + event["severity"]
+        generatorname = generatordict[dictname]
+        valuename = event["element"] + component
+        trigger = str(event["target"])
+        if type(event["target"]) == str:
+            trigger = "\"" + str(event["target"] + "\"")
+        server.write(writeindent + valuename + "= await " + component + ".get_child([\"2:" + eventsearchname + "\"])\n")
+        server.write(writeindent + "if (await " + valuename + ".get_value()) " + event["trigger"] + " " + trigger + ":\n")
+        writeindent += "    "
+        server.write(writeindent + "await " + generatorname+ ".trigger(message=\"" + event["message"] + "\")\n")
+        writeindent = ""
+        for i in range(indent):
+            writeindent += "    "
 
 
 
@@ -222,6 +263,7 @@ def writendpt2():
     server = open("opcua-server.py", "a")
     server.write("""
             await asyncio.sleep(1)
+            count += 1
 
 if __name__ == '__main__':
     asyncio.run(main())""")
-- 
GitLab