コード例 #1
0
    def reader_hook(self, attribute, values):
        """This method will be executed by the ReaderProcess to process the queried data."""
        try:
            print('>' * 80)
            print(time.ctime() + ' In reader_hook(%s,[%d])' %
                  (attribute, len(values)))

            MAXDIM = 1024 * 1024 * 1024
            #First create the attributes
            epoch, data, aname = [], [], attribute.replace('/', '__')
            values = decimate_values(values)
            [(epoch.append(v[0]), data.append(v[1])) for v in values]
            writable = PyTango.AttrWriteType.READ

            #Adding time attribute
            m, atformat, dims = None, PyTango.SpectrumAttr, [MAXDIM]
            for d in data:
                if d is not None:
                    if fn.isSequence(d):
                        atformat, dims = PyTango.ImageAttr, [MAXDIM, MAXDIM]
                        m = d[0]
                    else:
                        m = d
                    break

            attype = PyTango.DevDouble if (
                fn.isNumber(m) or fn.isBool(m)) else PyTango.DevString
            self.add_attribute(
                PyTango.ImageAttr(aname, attype, writable, MAXDIM, MAXDIM),
                self.read_dyn_attr, None, self.is_dyn_attr_allowed)

            self.add_attribute(
                PyTango.SpectrumAttr(aname + '_t', PyTango.DevDouble, writable,
                                     MAXDIM), self.read_dyn_attr, None,
                self.is_dyn_attr_allowed)

            self.add_attribute(
                PyTango.SpectrumAttr(aname + '_d', PyTango.DevString, writable,
                                     MAXDIM), self.read_dyn_attr, None,
                self.is_dyn_attr_allowed)

            self.add_attribute(atformat(aname + '_r', attype, writable,
                                        *dims), self.read_dyn_attr, None,
                               self.is_dyn_attr_allowed)

            #Then add the data to Cache values, so IsDataReady will return True
            t = fn.now()
            self.RemoveCachedAttribute(attribute)
            self.AttrData[attribute] = (t, atformat, attype, values)
            print('Done: %s,%s,%s,%s,%d' %
                  (attribute, t, atformat, attype, len(values)))
        except:
            print(traceback.format_exc())
コード例 #2
0
    def initialize_dynamic_attributes(self):
        """ Initialize dynamic attributes
        """
        if self.IsCameraOnline():

            # Get attributes
            multi_attr = self.get_device_attr()

            # Set minimum and maximum integration time
            attribute = multi_attr.get_attr_by_name("ExposureTime")
            multi_prop = attribute.get_properties()
            multi_prop.unit = self.camera.ExposureTimeAbs.Unit
            multi_prop.min_value = "{0:.1f}".format(
                self.camera.ExposureTimeAbs.GetMin())
            multi_prop.max_value = "{0:.1f}".format(
                self.camera.ExposureTimeAbs.GetMax())
            attribute.set_properties(multi_prop)
            attribute.set_change_event(True, False)

            # Set minimum and maximum gain
            attribute = multi_attr.get_attr_by_name("Gain")
            multi_prop = attribute.get_properties()
            if "Gain" in dir(self.camera):
                multi_prop.min_value = "{0:.1f}".format(
                    self.camera.Gain.GetMin())
                multi_prop.max_value = "{0:.1f}".format(
                    self.camera.Gain.GetMax())
            else:
                multi_prop.min_value = "{0:.1f}".format(
                    self.gc.raw2db(self.camera.GainRaw.GetMin(),
                                   self.camera.DeviceModelName()))
                multi_prop.max_value = "{0:.1f}".format(
                    self.gc.raw2db(self.camera.GainRaw.GetMax(),
                                   self.camera.DeviceModelName()))
            attribute.set_properties(multi_prop)
            attribute.set_change_event(True, False)

            # Enable change event on enable trigger
            attribute = multi_attr.get_attr_by_name("EnableTrigger")
            attribute.set_change_event(True, False)

            # Create TriggerSource attribute
            attr = PT.Attr("TriggerSource", PT.DevEnum,
                           PT.AttrWriteType.READ_WRITE)
            attr_prop = PT.UserDefaultAttrProp()
            attr_prop.label = "Trigger Source"
            attr_prop.set_enum_labels(
                list(self.camera.TriggerSource.GetSymbolics()))
            attr.set_default_properties(attr_prop)
            attr.set_memorized()
            attr.set_memorized_init(True)
            attr.set_change_event(True, False)
            self.add_attribute(attr, self.read_TriggerSource,
                               self.write_TriggerSource, self.IsCameraOnline)

            # Create PixelFormat attribute
            attr = PT.Attr("PixelFormat", PT.DevEnum,
                           PT.AttrWriteType.READ_WRITE)
            attr_prop = PT.UserDefaultAttrProp()
            attr_prop.label = "Pixel Format"
            attr_prop.set_enum_labels(
                list(self.camera.PixelFormat.GetSymbolics()))
            attr.set_default_properties(attr_prop)
            attr.set_memorized()
            attr.set_memorized_init(True)
            attr.set_change_event(True, False)
            self.add_attribute(attr, self.read_PixelFormat,
                               self.write_PixelFormat, self.IsCameraOnline)

            # Create auto-exposure attribute
            if "ExposureAuto" in dir(self.camera):
                attr = PT.Attr("AutoExposure", PT.DevEnum,
                               PT.AttrWriteType.READ_WRITE)
                attr_prop = PT.UserDefaultAttrProp()
                attr_prop.label = "Auto exposure"
                attr_prop.set_enum_labels(
                    list(self.camera.ExposureAuto.GetSymbolics()))
                attr.set_default_properties(attr_prop)
                attr.set_change_event(True, False)
                self.add_attribute(attr, self.read_AutoExposure,
                                   self.write_AutoExposure,
                                   self.IsCameraOnline)

                # Brightness target
                attr = PT.Attr("AutoBrightnessTarget", PT.DevUShort,
                               PT.AttrWriteType.READ_WRITE)
                attr_prop = PT.UserDefaultAttrProp()
                attr_prop.label = "Auto brightness target"
                attr_prop.min_value = "{0:d}".format(
                    self.camera.AutoTargetValue.GetMin())
                attr_prop.max_value = "{0:d}".format(
                    self.camera.AutoTargetValue.GetMax())
                attr_prop.format = "%d"
                attr.set_default_properties(attr_prop)
                attr.set_memorized()
                attr.set_memorized_init(True)
                attr.set_change_event(True, False)
                self.add_attribute(attr, self.read_AutoBrightnessTarget,
                                   self.write_AutoBrightnessTarget,
                                   self.IsCameraOnline)

                # Exposure time lower limit
                attr = PT.Attr("AutoExposureLowerLimit", PT.DevDouble,
                               PT.AttrWriteType.READ_WRITE)
                attr_prop = PT.UserDefaultAttrProp()
                attr_prop.label = "Auto exposure time lower limit"
                attr_prop.min_value = "{0:.1f}".format(
                    self.camera.AutoExposureTimeAbsLowerLimit.GetMin())
                attr_prop.max_value = "{0:.1f}".format(
                    self.camera.AutoExposureTimeAbsLowerLimit.GetMax())
                attr_prop.format = "%.1f"
                attr_prop.unit = "us"
                attr.set_default_properties(attr_prop)
                attr.set_memorized()
                attr.set_memorized_init(True)
                attr.set_change_event(True, False)
                self.add_attribute(attr, self.read_AutoExposureLowerLimit,
                                   self.write_AutoExposureLowerLimit,
                                   self.IsCameraOnline)

                # Exposure time upper limit
                attr = PT.Attr("AutoExposureUpperLimit", PT.DevDouble,
                               PT.AttrWriteType.READ_WRITE)
                attr_prop = PT.UserDefaultAttrProp()
                attr_prop.label = "Auto exposure time lower limit"
                attr_prop.min_value = "{0:.1f}".format(
                    self.camera.AutoExposureTimeAbsUpperLimit.GetMin())
                attr_prop.max_value = "{0:.1f}".format(
                    self.camera.AutoExposureTimeAbsUpperLimit.GetMax())
                attr_prop.format = "%.1f"
                attr_prop.unit = "us"
                attr.set_default_properties(attr_prop)
                attr.set_memorized()
                attr.set_memorized_init(True)
                attr.set_change_event(True, False)
                self.add_attribute(attr, self.read_AutoExposureUpperLimit,
                                   self.write_AutoExposureUpperLimit,
                                   self.IsCameraOnline)

            # Create image attributes
            # NOTE: also the full image is created as a dynamic attribute because creating it as a static attribute hang the
            # image callback on push_change_event call
            attr = PT.ImageAttr("Image", PT.DevUShort, PT.AttrWriteType.READ,
                                2048, 2048)
            attr.set_change_event(True, False)
            self.add_attribute(attr, self.read_image)

            # Create one image for each defined ROIs
            for r in self.rois:
                m = re.match("(\d+):(\d+):(\d+):(\d+)", r)
                if m is not None:
                    try:
                        x = int(m.groups()[0])
                        y = int(m.groups()[1])
                        w = int(m.groups()[2])
                        h = int(m.groups()[3])

                        attr_name = "Image_{0:02d}".format(len(self.rois_img))
                        self.debug_stream(
                            "Adding attribute for roi [X: {0:d}, Y: {1:d}, W: {2:d}, H: {3:d}], named '{4}'"
                            .format(x, y, w, h, attr_name))

                        attr = PT.ImageAttr(attr_name, PT.DevUShort,
                                            PT.AttrWriteType.READ, 2048, 2048)
                        attr.set_change_event(True, False)
                        self.add_attribute(attr, self.read_roi_image)
                        self.rois_img.append({
                            'x': x,
                            'y': y,
                            'w': w,
                            'h': h,
                            'name': attr_name,
                            'image': None
                        })
                    except PT.DevFailed as e:
                        self.error_stream(
                            "Failed to create attribute. Error: {0!s}".format(
                                e.args[0]))
                    except Exception as e:
                        self.error_stream(
                            "Failed to create attribute. Error: {0!s}".format(
                                e))

            # Initialization done, we can start grabbing
            self.start_grabbing()