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())
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()