diff --git a/jsonparse.py b/jsonparse.py index 1d2d3c15f174c039fc137ab4e237d94f56ccd9ea..827c175cd37c83d48a87d9e5e5d97c0317edb450 100644 --- a/jsonparse.py +++ b/jsonparse.py @@ -1,30 +1,63 @@ import json from collections import namedtuple -#from json import JSONEncoder def measurementJsonDecod(measurementdict): return namedtuple('Measurement', measurementdict.keys())(*measurementdict.values()) +def parameterJsonDecod(parameterdict): + return namedtuple('Parameter', parameterdict.keys())(*parameterdict.values()) + class Measurement: - def __init__(self, name, description, datatype,dimension, unit = None, range=None) : + def __init__(self, name, description, datatype, value, dimension, unit=None, range=None): self.name = name self.description = description self.datatype = datatype self.range = range self.dimension = dimension self.unit = unit - #self.value = value array = [] - # calculate a start value - if self.dimension != 0: - for i in range(self.dimension): - array.append(self.datatype((self.range[0] + self.range[1]) / 2)) - self.value = array + if self.datatype == "float": + self.value = float(value) else: - self.value = self.datatype(((self.range[0] + self.range[1]) / 2)) + self.value = value + # calculate a start value + # if self.dimension != 0: + # for i in range(self.dimension): + # arrayval = self.datatype((self.range[0] + self.range[1]) / 2) + # if self.datatype == "float" or self.datatype == "double": + # arrayval = float(arrayval) + # array.append(arrayval) + # self.value = [0.0, 0.0, 0.0] + # else: + # self.value = self.datatype(((self.range[0] + self.range[1]) / 2)) +class Parameter: + def __init__(self, name, description, datatype, dimension, value, rangevar=None, unit=None, default=None, constant=False): + self.name = name + self.description = description + self.datatype = datatype + # if range == [None, None]: + # self.range = None + # else: + self.range = rangevar + self.dimension = dimension + self.unit = unit + self.default = default + self.constant = constant + self.value = value + # array = [] + # calculate a start value + # if self.default == False: + # if self.dimension != 0: + # for i in range(self.dimension): + # array.append(self.datatype((self.range[0] + self.range[1]) / 2)) + # self.value = array + # else: + # self.value = self.datatype(((self.range[0] + self.range[1]) / 2)) + # else: + # self.value = self.datatype(default) def dimensionchange(string): dimarr = string["dimension"] @@ -37,31 +70,52 @@ def dimensionchange(string): def changerange(string): - range = string["range"] - rangetuple = (range[0], range[1]) - string.update({"range": rangetuple}) + #print(type(string["range"][0])) + if string["range"] != "[None, None]": + rangeval = string["range"] + rangetuple = (rangeval[0], rangeval[1]) + #print(rangetuple) + string.update({"range": rangetuple}) + print(string["range"]) + else: + del string["range"] + print(string) -with open ("soil-dummies/src/robot/model.json") as file: +with open("soil-dummies/src/robot/model.json") as file: #robot = json.dumps(file.read()) robotload = json.loads(file.read()) measurements = robotload["measurements"] - measurementobj = [] - for i in measurements: - obj = i - #del obj["value"] - del obj["uuid"] - dimensionchange(obj) - if i["range"]: + if len(measurements) > 0: + measurementobj = [] + for i in measurements: + obj = i + #del obj["value"] + del obj["uuid"] + dimensionchange(obj) + #if i["range"]: changerange(obj) - obj = json.dumps(i) - measurementobji = json.loads(obj, object_hook=measurementJsonDecod) - measurementobj.append(measurementobji) - #measurementobj[2].value = [0.0, 0.0, 0.0] - # print(measurements) - # print(measurementobj[0].value) - # for i in measurementobj: - # print(i) + obj = json.dumps(i) + measurementobji = json.loads(obj, object_hook=measurementJsonDecod) + measurementobj.append(measurementobji) + + print(measurementobj) + parameters = robotload["parameters"] + + if len(parameters) > 0: + parameterobj = [] + for i in parameters: + obj = i + # del obj["value"] + del obj["uuid"] + dimensionchange(obj) + if i["range"]: + changerange(obj) + obj = json.dumps(i) + parameterobji = json.loads(obj, object_hook=parameterJsonDecod) + parameterobj.append(parameterobji) + + print(parameterobj) diff --git a/robot.py b/robot.py index 5e774c7b2d2a0c0897d39c8ca1cef89fe859d3fc..720b90ba328e6d2daf68a3e57479218b23d8a5b1 100644 --- a/robot.py +++ b/robot.py @@ -11,8 +11,8 @@ from asyncua.common import node logging.basicConfig(level=logging.INFO) _logger = logging.getLogger('asyncua') -def getobj(name): - for i in jsonparse.measurementobj: +def getobj(name, list): + for i in list: if i.name == name: return i @@ -82,15 +82,16 @@ async def main(): # batteryobject = Measurement("Battery level", "Battery level", int , 0 ,(0, 100), "percent") # measureobjectlist = [tcpobject , positionobject, batteryobject] - tcpobject = getobj("Tool Center Point") - positionobject = getobj("Position") - batteryobject = getobj("Battery level") + tcpobject = getobj("Tool Center Point", jsonparse.measurementobj) + positionobject = getobj("Position", jsonparse.measurementobj) + batteryobject = getobj("Battery level", jsonparse.measurementobj) measureobjectlist = jsonparse.measurementobj #parameterobjekte - openobject = Parameter("Open", "Flag to specify if something is open.", bool, 0, default = True) - automoveobject = Parameter("Autonomous Movement", "If true, the robot moves around freely autonomously.", bool, 0, default = True) - paraobjectlist = [openobject, automoveobject] + openobject = getobj("Autonomous Movement", jsonparse.parameterobj) + #automoveobject = Parameter("Autonomous Movement", "If true, the robot moves around freely autonomously.", bool, 0, default = True) + # paraobjectlist = [openobject, automoveobject] + paraobjectlist = jsonparse.parameterobj #hauptobjekt myobjtype = await server.nodes.base_object_type.add_object_type(idx, "Robot") @@ -113,7 +114,7 @@ async def main(): name = await myobjtype.add_variable(idx, a.name, a.value, varianttype=varianttype, datatype=vartype.nodeid) await name.set_modelling_rule(True) #namelist = namelist + name - if a.range is not None: + if a.range is not None and a.range is not [None, None]: rangeprop = await name.add_property(idx, "range", ua.Range(a.range[0], a.range[1])) await rangeprop.set_modelling_rule(True) if a.unit is not None: @@ -126,9 +127,14 @@ async def main(): #parameters for a in paraobjectlist: - para = await myobjtype.add_variable(idx, a.name, a.value, datatype=paratype.nodeid) + varianttype = ua.VariantType.Int64 + if a.datatype == "float" or a.datatype == "double": + varianttype = ua.VariantType.Double + elif a.datatype == "boolean": + varianttype = ua.VariantType.Boolean + para = await myobjtype.add_variable(idx, a.name, a.value, varianttype=varianttype, datatype=paratype.nodeid) await para.set_modelling_rule(True) - if a.range is not None: + if (a.range is not None) and (a.range != [None, None]): rangeprop = await para.add_property(idx, "range", ua.Range(a.range[0], a.range[1])) await rangeprop.set_modelling_rule(True) if a.unit is not None: @@ -156,7 +162,7 @@ async def main(): #getting node ids of battery and position robotposname = "2:" + positionobject.name positionrobot = await mobilerobot.get_child([robotposname]) - positionrobot.set_writable(True) + await positionrobot.set_writable(True) @uamethod def goTo(parent, position): @@ -173,7 +179,7 @@ async def main(): # tcprobmeas = await robot.get_child([tcpvarname]) #adding function goTo to robot - goTofunc = await mobilerobot.add_method(idx, "goToset", goTo, [ua.VariantType.Float], [ua.VariantType.Float]) + goTofunc = await mobilerobot.add_method(idx, "goTo", goTo, [ua.VariantType.Float], [ua.VariantType.Float]) #batterylow warning event batterywarning = await server.create_custom_event_type(idx, "BatteryLowWarning", ua.ObjectIds.SystemEventType) @@ -200,6 +206,7 @@ async def main(): async with server: print("Server läuft!") + print(paraobjectlist) time = 0 while True: