class DAS(PyTango.Device_4Impl): #--------- Add you global variables here -------------------------- #------------------------------------------------------------------ # Device constructor #------------------------------------------------------------------ def __init__(self, cl, name): PyTango.Device_4Impl.__init__(self, cl, name) DAS.init_device(self) #------------------------------------------------------------------ # Device initialization #------------------------------------------------------------------ def init_device(self): self.get_device_properties(self.get_device_class()) # To make sure we get events without polling self.set_change_event("State", True, False) self.set_change_event("jobSuccess", True, False) self.set_change_event("jobFailure", True, False) self.set_change_event("dataAnalysisInformation", True, False) # Get configuration from Tango properties self._config = self.loadConfig() # Start the state machine #self._dasStateMachine = DASStateMachine(self) #self._dasStateMachine.start() #self._serverControl = ServerControl() self._serverControl = ServerControl(_logger_method=self.debug_stream) self.startRemoteServers() self.push_change_event("State", self.get_state()) #------------------------------------------------------------------ # Device destructor #------------------------------------------------------------------ def delete_device(self): self.debug_stream("[Device delete_device method] for device", self.get_name()) #------------------------------------------------------------------ # Always excuted hook method #------------------------------------------------------------------ def always_executed_hook(self): #self.debug_stream("In ", self.get_name(), "::always_excuted_hook()") pass #------------------------------------------------------------------ # jobFailure command: # # Description: # argin: DevString jobId # argout: None #------------------------------------------------------------------ def jobFailure(self, argin): self.debug_stream("In ", self.get_name(), "::jobFailure()") # Sometimes argin can be None... if argin is None: self.debug_stream("argin is None") else: self.debug_stream(" argin is ", argin) # And sometimes even argin.attr_value can be None! if argin.attr_value is None: self.debug_stream("argin.attr_value is None") elif argin.attr_value.value is None: self.debug_stream("argin.attr_value.value is None") else: self.push_change_event("jobFailure", argin.attr_value.value) self.push_change_event("dataAnalysisInformation", [argin.attr_value.value, "failure"]) #------------------------------------------------------------------ # jobSuccess command: # # Description: # argin: DevString jobId # argout: None #------------------------------------------------------------------ def jobSuccess(self, argin): self.debug_stream("In ", self.get_name(), "::jobSuccess()") # Sometimes argin can be None... if argin is None: self.debug_stream("argin is None") else: self.debug_stream(" argin is ", argin) # And sometimes even argin.attr_value can be None! if argin.attr_value is None: self.debug_stream("argin.attr_value is None") elif argin.attr_value.value is None: self.debug_stream("argin.attr_value.value is None") else: self.push_change_event("jobSuccess", argin.attr_value.value) self.push_change_event("dataAnalysisInformation", [argin.attr_value.value, "success"]) #---- JobFailure attribute State Machine ----------------- def is_JobFailure_allowed(self, req_type): if self.get_state() in [PyTango.DevState.OFF, PyTango.DevState.FAULT]: # End of Generated Code # Re-Start of Generated Code return False return True #------------------------------------------------------------------ # Read JobFailure attribute #------------------------------------------------------------------ def read_JobFailure(self, attr): self.debug_stream("In ", self.get_name(), "::read_JobFailure()") # Add your own code here attr_JobFailure_read = "Hello Tango world" attr.set_value(attr_JobFailure_read) #---- JobSuccess attribute State Machine ----------------- def is_JobSuccess_allowed(self, req_type): if self.get_state() in [PyTango.DevState.OFF, PyTango.DevState.FAULT]: # End of Generated Code # Re-Start of Generated Code return False return True #------------------------------------------------------------------ # Read JobSuccess attribute #------------------------------------------------------------------ def read_JobSuccess(self, attr): self.debug_stream("In ", self.get_name(), "::read_JobSuccess()") # Add your own code here attr_JobSuccess_read = "Hello Tango world" attr.set_value(attr_JobSuccess_read) #------------------------------------------------------------------ # Read Attribute Hardware #------------------------------------------------------------------ def read_attr_hardware(self, data): self.debug_stream("In ", self.get_name(), "::read_attr_hardware()") def getConfig(self): return self._config def loadConfig(self): db = PyTango.Database() listXmlConfig = db.get_device_property(self.get_name(), "Config")["Config"] #self.debug_stream(listXmlConfig, type(listXmlConfig)) config = None if len(listXmlConfig) == 0: self.debug_stream("ERROR! No property 'Config' defined in Tango data base for device server %s" % self.get_name()) sys.exit(1) try: # Convert list of lines to one string strXmlConfig = ''.join(listXmlConfig) config = DASConfig.parseString(strXmlConfig) #self.debug_stream(config.marshal()) except Exception: self.debug_stream("ERROR! Exception caught when trying to unmarshal config XML for server %s" % self.get_name()) self.debug_stream("Config XML:") self.debug_stream(strXmlConfig) raise return config #================================================================== # # DAS read/write attribute methods # #================================================================== #------------------------------------------------------------------ # Read jobSuccess attribute #------------------------------------------------------------------ def read_jobSuccess(self, attr): self.debug_stream("In ", self.get_name(), "::read_jobSuccess()") # Add your own code here attr_jobSuccess_read = "Hello Tango world" attr.set_value(attr_jobSuccess_read) #------------------------------------------------------------------ # Read jobFailure attribute #------------------------------------------------------------------ def read_jobFailure(self, attr): self.debug_stream("In ", self.get_name(), "::read_jobFailure()") # Add your own code here attr_jobFailure_read = "Hello Tango world" attr.set_value(attr_jobFailure_read) #------------------------------------------------------------------ # Read dataAnalysisInformation attribute #------------------------------------------------------------------ def read_dataAnalysisInformation(self, attr): self.debug_stream("In ", self.get_name(), "::read_dataAnalysisInformation()") # Add your own code here attr_dataAnalysisInformation_read = ["No job launched yet", "failure"] attr.set_value(attr_dataAnalysisInformation_read) #---- dataAnalysisInformation attribute State Machine ----------------- def is_dataAnalysisInformation_allowed(self, req_type): if self.get_state() in [PyTango.DevState.OFF, PyTango.DevState.FAULT]: # End of Generated Code # Re-Start of Generated Code return False return True #================================================================== # # DAS command methods # #================================================================== #------------------------------------------------------------------ # State command: # # Description: This command gets the device state (stored in its <i>device_state</i> data member) and returns it to the caller. # # argout: DevState State Code #------------------------------------------------------------------ def dev_state(self): #self.debug_stream("In ", self.get_name(), "::dev_state() = " , self.get_state()) # Add your own code here if not self._serverControl.checkServer(self._config.EDNA.tangoDevice): # trick - only restart the server if the server has already been detected down # this will happen the second time dev_state() if self.get_state() == PyTango.DevState.OFF: self.startRemoteServers(_serverToStart="EDNA") else: self.set_state(PyTango.DevState.OFF) if self._config.Workflow is not None: if not self._serverControl.checkServer(self._config.Workflow.tangoDevice): # trick - same trick as above if self.get_state() == PyTango.DevState.OFF: self.startRemoteServers(_serverToStart="Workflow") else: self.set_state(PyTango.DevState.OFF) argout = self.get_state() return argout #------------------------------------------------------------------ # Status command: # # Description: This command gets the device status (stored in its <i>device_status</i> data member) and returns it to the caller. # # argout: ConstDevString Status description #------------------------------------------------------------------ def dev_status(self): self.debug_stream("In ", self.get_name(), "::dev_status()") self.the_status = self.get_status() # Add your own code here self.set_status(self.the_status) return self.the_status #------------------------------------------------------------------ # startJob command: # # Description: # argin: DevVarStringArray [<Module to execute>,<XML input>] # argout: DevString job id #------------------------------------------------------------------ def startJob(self, argin): self.debug_stream("In ", self.get_name(), "::startJob()") #self._config = self.loadConfig() self.debug_stream("argin = ", argin) try: argout = self._ednaClient.startJob(argin) except Exception, e: self.debug_stream("ERROR in startJob! ", type(e)) # TODO: Restart EDNA server raise self.debug_stream("argout = ", argout) return argout