From: cfalcon <cf...@ce...> - 2015-12-02 15:27:35
|
TangoAttribute raises a TypeError: "an integer is required" when you try to write in a DevUChar attribute. PyTango expects an int value while Taurus is trying to write a str value. Fix it. Changing the Taurus type uses for DevUChar TangoAttributes. The Tango decode method returns for a chr of the reading value, and the encode method returns the ord. --- lib/taurus/core/tango/enums.py | 4 ++-- lib/taurus/core/tango/tangoattribute.py | 10 +++++++++- lib/taurus/core/tango/util/tango_taurus.py | 2 +- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/lib/taurus/core/tango/enums.py b/lib/taurus/core/tango/enums.py index 9b46948..7e41158 100644 --- a/lib/taurus/core/tango/enums.py +++ b/lib/taurus/core/tango/enums.py @@ -70,7 +70,7 @@ EVENT_TO_POLLING_EXCEPTIONS = ('API_AttributePollingNotStarted', FROM_TANGO_TO_NUMPY_TYPE = { PyTango.DevBoolean : numpy.bool8, - PyTango.DevUChar : numpy.ubyte, + PyTango.DevUChar : numpy.uint8, PyTango.DevShort : numpy.short, PyTango.DevUShort : numpy.ushort, PyTango.DevLong : numpy.int32, @@ -84,7 +84,7 @@ FROM_TANGO_TO_NUMPY_TYPE = { FROM_TANGO_TO_STR_TYPE = { PyTango.DevBoolean : 'bool8', - PyTango.DevUChar : 'ubyte', + PyTango.DevUChar : 'uint8', PyTango.DevShort : 'short', PyTango.DevUShort : 'ushort', PyTango.DevLong : 'int32', diff --git a/lib/taurus/core/tango/tangoattribute.py b/lib/taurus/core/tango/tangoattribute.py index 2067a96..27560f0 100755 --- a/lib/taurus/core/tango/tangoattribute.py +++ b/lib/taurus/core/tango/tangoattribute.py @@ -112,6 +112,9 @@ class TangoAttrValue(TaurusAttrValue): rvalue = Quantity(rvalue, units=units) if wvalue is not None: wvalue = Quantity(wvalue, units=units) + if p.type == PyTango.CmdArgType.DevUChar: + rvalue = chr(rvalue) + wvalue = chr(wvalue) if isinstance(rvalue, PyTango._PyTango.DevState): rvalue = DevState[str(rvalue)] @@ -357,7 +360,12 @@ class TangoAttribute(TaurusAttribute): except: attrvalue = str(magnitude).lower() == 'true' elif tgtype == PyTango.CmdArgType.DevUChar: - attrvalue = chr(magnitude) + try: + magnitude = chr(int(magnitude)) + except ValueError: + pass + finally: + attrvalue = ord(magnitude) elif tgtype in (PyTango.CmdArgType.DevState, PyTango.CmdArgType.DevEncoded): attrvalue = magnitude diff --git a/lib/taurus/core/tango/util/tango_taurus.py b/lib/taurus/core/tango/util/tango_taurus.py index 81c8dc4..04e4ede 100644 --- a/lib/taurus/core/tango/util/tango_taurus.py +++ b/lib/taurus/core/tango/util/tango_taurus.py @@ -60,7 +60,7 @@ FROM_TANGO_TO_TAURUS_TYPE = {PyTango.CmdArgType.DevVoid:None, PyTango.CmdArgType.DevState:DataType.DevState, PyTango.CmdArgType.ConstDevString:DataType.String, PyTango.CmdArgType.DevVarBooleanArray:DataType.Boolean, - PyTango.CmdArgType.DevUChar:DataType.Integer, # maybe should be Bytes? + PyTango.CmdArgType.DevUChar:DataType.Bytes, PyTango.CmdArgType.DevLong64:DataType.Integer, PyTango.CmdArgType.DevULong64:DataType.Integer, PyTango.CmdArgType.DevVarLong64Array:DataType.Integer, -- 2.4.0 |