コード例 #1
0
ファイル: DAS.py プロジェクト: ESRF/DAS
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