diff --git a/jsonparse.py b/jsonparse.py index 47ec08971c022e11ef37d00062ecaab247ca5246..8027d92d2aef3300892e47d3ec9081ead120aec6 100644 --- a/jsonparse.py +++ b/jsonparse.py @@ -108,6 +108,16 @@ def changerange(string): print(string) +def getobjnames(argarray): + returnarr = [] + if len(argarray) > 0: + for i in argarray: + name = (i["name"].lower()).replace(" ", "") + returnarr.append(name) + return returnarr + else: + return None + def main(): try: JSON_MODEL = sys.argv[1][:-5] @@ -159,6 +169,8 @@ def main(): for i in functions: obj = i # del obj["value"] + obj["inargsnames"] = getobjnames(obj["arguments"]) + obj["outargsnames"] = getobjnames(obj["returns"]) obj["inargsdatatypes"] = getdatatypes(obj["arguments"]) obj["outargsdatatypes"] = getdatatypes(obj["returns"]) del obj["uuid"] @@ -171,7 +183,7 @@ def main(): print(functionobj) print(parameterobj) #exec(open("writefile.py").read()) - wf.write(measurementobj, parameterobj) + wf.write(measurementobj, parameterobj, functionobj) diff --git a/writefile.py b/writefile.py index 6ba12b7c94e4b80590eccc91063c8ee6d5b2a1a8..cc0ac5ce3f00af68d663eb30c54318590b6ed93f 100644 --- a/writefile.py +++ b/writefile.py @@ -1,13 +1,31 @@ import jsonparse import os -def defFunction(functionname, file, indent, contents = None): +def defFunction(functionname, file, indent, inargs): writeindent = "" for i in range(indent): - writeindent = writeindent + "\t" - file.write(indent + "async def " + functionname + ":") - -def write(measurementobj, parameterobj): + writeindent = writeindent + " " + file.write(writeindent + "async def " + functionname + "(parent, ") + for i in range (len(inargs)): + if i < (len(inargs) - 1): + file.write(inargs[i] + ", ") + else: + file.write(inargs[i]) + file.write("):\n") + writeindent = writeindent + " " + file.write(writeindent + """#ToDo: Write an algorithm that fits the description of the function. + pass + """) + +def getVariantType(datatype): + varianttype = "ua.VariantType.Int64" + if datatype == "float" or datatype == "double": + varianttype = "ua.VariantType.Double" + elif datatype == "Boolean": + varianttype = "ua.VariantType.Boolean" + return varianttype + +def write(measurementobj, parameterobj, functionobj): if os.path.exists("opcua-server.py"): os.remove("opcua-server.py") server = open("opcua-server.py", "a") @@ -51,19 +69,17 @@ _logger = logging.getLogger('asyncua') server.write("\n" + writeindent + "# creating all measurements with their properterties\n") + measurementdict = {} for i in measurementobj: - varianttype = "ua.VariantType.Int64" - if i.datatype == "float" or i.datatype == "double": - varianttype = "ua.VariantType.Double" - elif i.datatype == "Boolean": - varianttype = "ua.VariantType.Boolean" + varianttype = getVariantType(i.datatype) datatype = "measurementtype.nodeid" varname = ((i.name).lower()).replace(" ", "") + "var" + measurementdict[i.name] = varname server.write(writeindent + varname + " = " + "await myobjtype.add_variable(idx, \"" + str(i.name) + "\", " + str(i.value) + ", " + varianttype + ", " + datatype + ")\n") server.write(writeindent + "await " + varname + "." + "set_modelling_rule(True)\n") if i.range is not None and i.range is not [None, None]: rangename = "rangeprop" - server.write(writeindent + rangename + " = await " + varname + ".add_property(idx, range, ua.Range(" + str(i.range[0]) + "," + str(i.range[1]) + "))\n") + server.write(writeindent + rangename + " = await " + varname + ".add_property(idx, \"range\", ua.Range(" + str(i.range[0]) + "," + str(i.range[1]) + "))\n") server.write(writeindent + "await " + rangename + ".set_modelling_rule(True)\n") if i.unit is not None: unitname = "unitprop" @@ -75,19 +91,17 @@ _logger = logging.getLogger('asyncua') server.write("\n" + writeindent + "#creating all parameters with their properties\n") + parameterdict = {} for i in parameterobj: - varianttype = "ua.VariantType.Int64" - if i.datatype == "float" or i.datatype == "double": - varianttype = "ua.VariantType.Double" - elif i.datatype == "Boolean": - varianttype = "ua.VariantType.Boolean" + varianttype = getVariantType(i.datatype) datatype = "parametertype.nodeid" varname = ((i.name).lower()).replace(" ", "") + "var" + parameterdict[i.name] = varname server.write(writeindent + varname + " = " + "await myobjtype.add_variable(idx, \"" + str(i.name) + "\", " + str(i.value) + ", " + varianttype + ", " + datatype + ")\n") server.write(writeindent + "await " + varname + "." + "set_modelling_rule(True)\n") if i.range is not None and i.range is not [None, None]: rangename = "rangeprop" - server.write(writeindent + rangename + " = await " + varname + ".add_property(idx, range, ua.Range(" + str(i.range[0]) + "," + str(i.range[1]) + "))\n") + server.write(writeindent + rangename + " = await " + varname + ".add_property(idx, \"range\", ua.Range(" + str(i.range[0]) + "," + str(i.range[1]) + "))\n") server.write(writeindent + "await " + rangename + ".set_modelling_rule(True)\n") if i.unit is not None: unitname = "unitprop" @@ -97,6 +111,23 @@ _logger = logging.getLogger('asyncua') server.write(writeindent + "description = await " + varname + ".add_property(idx, \"Description\", " + "\"" + i.description + "\")" + "\n") server.write(writeindent + "await description.set_modelling_rule(True)\n\n") + server.write(writeindent + "mobilerobot = await server.nodes.objects.add_object(idx, \"Mobile Robot \", myobjtype.nodeid)\n") + + server.write(writeindent + "#adding functions to our robot\n") + + for i in functionobj: + functionname = (i.name.lower()).replace(" ", "") + defFunction(functionname, server, indent, i.inargsnames) + server.write("\n") + inargslist = [] + if i.inargsdatatypes != 0: + for j in i.inargsdatatypes: + inargslist.append(getVariantType(j)) + outargslist = [] + if i.outargsdatatypes != None: + for j in i.outargsdataypes: + inargslist.append(getVariantType(j)) + server.write(writeindent + "await mobilerobot.add_method(idx, \"" + i.name +"\", " + functionname + ", " + str(inargslist) + ", "+ str(outargslist) + ")\n\n") server.write(""" async with server: @@ -105,7 +136,7 @@ _logger = logging.getLogger('asyncua') while True: await asyncio.sleep(1) -if __name__ == 'main': +if __name__ == '__main__': asyncio.run(main())""")