diff options
Diffstat (limited to 'tango/Uca')
| -rwxr-xr-x | tango/Uca | 121 | 
1 files changed, 121 insertions, 0 deletions
| diff --git a/tango/Uca b/tango/Uca new file mode 100755 index 0000000..47f4021 --- /dev/null +++ b/tango/Uca @@ -0,0 +1,121 @@ +#!/usr/bin/env python + +import sys +import time +import numpy as np +import PyTango +from gi.repository import Uca, GObject +from PyTango import Attr, AttrWriteType, DevState +from PyTango.server import Device, DeviceMeta, device_property, command, server_run + +try: +    import tifffile +    HAVE_TIFFFILE = True +except ImportError: +    print("Could not import tifffile, consider to install it") +    HAVE_TIFFFILE = False + + +def get_tango_type(prop): +    mapping = { +        GObject.TYPE_BOOLEAN: PyTango.CmdArgType.DevBoolean, +        GObject.TYPE_CHAR: PyTango.CmdArgType.DevUChar, +        GObject.TYPE_UCHAR: PyTango.CmdArgType.DevUChar, +        GObject.TYPE_FLOAT: PyTango.CmdArgType.DevFloat, +        GObject.TYPE_INT: PyTango.CmdArgType.DevShort,      # DevInt is invalid? +        GObject.TYPE_UINT: PyTango.CmdArgType.DevUShort,    # check +        GObject.TYPE_LONG: PyTango.CmdArgType.DevLong, +        GObject.TYPE_DOUBLE: PyTango.CmdArgType.DevDouble, +        GObject.TYPE_STRING: PyTango.CmdArgType.DevString, +    } + +    return mapping.get(prop, None) + + +def get_tango_write_type(prop): +    if prop.flags & GObject.ParamFlags.WRITABLE: +        if prop.flags & GObject.ParamFlags.READABLE: +            return AttrWriteType.READ_WRITE + +        return AttrWriteType.WRITE + +    if prop.flags & GObject.ParamFlags.READABLE: +        return AttrWriteType.READ + +    raise RuntimeError("{} has no valid param flag".format(prop.name)) + + +def prop_to_attr_name(name): +    return name.replace('-', '_') + + +def attr_to_prop_name(name): +    return name.replace('_', '-') + + +class Camera(Device): +    __metaclass__ = DeviceMeta + +    camera = device_property(dtype=str, default_value='mock') + +    def init_device(self): +        Device.init_device(self) +        self.set_state(DevState.ON) +        self.pm = Uca.PluginManager() +        self.device = self.pm.get_camerah(self.camera, None) +        self.attrs = {} + +        for prop in self.device.props: +            tango_type = get_tango_type(prop.value_type) +            write_type = get_tango_write_type(prop) + +            if tango_type: +                name = prop_to_attr_name(prop.name) +                attr = Attr(name, tango_type, write_type) +                attr_props = PyTango.UserDefaultAttrProp() +                attr_props.set_description(prop.blurb) +                attr.set_default_properties(attr_props) + +                write_func = None + +                if write_type in (AttrWriteType.WRITE, AttrWriteType.READ_WRITE): +                    write_func = self.do_write + +                self.attrs[prop.name] = self.add_attribute(attr, self.do_read, write_func) + +    def grab(self): +        array = np.empty(self.shape, dtype=self.dtype) +        data = array.__array_interface__['data'][0] +        self.device.grab(data) +        return array + +    def do_read(self, attr): +        name = attr_to_prop_name(attr.get_name()) +        attr.set_value(self.device.get_property(name)) + +    def do_write(self, attr): +        name = attr_to_prop_name(attr.get_name()) +        self.device.set_property(name, attr.get_write_value()) + +    @command +    def Start(self): +        self.shape = (self.device.props.roi_height, self.device.props.roi_width) +        self.dtype = np.uint16 if self.device.props.sensor_bitdepth > 8 else np.uint8 +        self.device.start_recording() + +    @command +    def Stop(self): +        self.device.stop_recording() + +    @command(dtype_in=str, doc_in="Path and filename to store frame") +    def Store(self, path): +        frame = self.grab() + +        if HAVE_TIFFFILE: +            tifffile.imsave(path, frame) +        else: +            np.savez(open(path, 'wb'), frame) + + +if __name__ == '__main__': +    server_run((Camera,)) | 
