Commit a9ae8f69 authored by Elisabetta Giani's avatar Elisabetta Giani
Browse files

CT-69: Added attributes:

- configurationID: store the scan configuration unique id (string).
- isCmdInProgress: report the execution state of a long-running command.
parent f79fe52f
Loading
Loading
Loading
Loading
+60 −5
Original line number Diff line number Diff line
@@ -716,8 +716,11 @@ class CspSubarray(SKASubarray):
            self._cmd_duration_measured[cmd_name] = time.time() - command_start_time
            self._cmd_progress[cmd_name] = 100
        self._last_executed_command = cmd_name
        self.logger.info("CspSubarray failure flag:{}".format(self._failure_raised))
        self.logger.info("CspSubarray timeout flag:{}".format(self._timeout_expired))
        # reset the CSP Subarray command execution flag
        self._cmd_execution_state[cmd_name] = CmdExecState.IDLE

        self.logger.info("CspSubarray ObsState:{}".format(self._obs_state))

    def __gotoidle(self, device_list, **args_dict):
@@ -1114,6 +1117,16 @@ class CspSubarray(SKASubarray):
        doc="The failure message on command execution",
    )

    isCmdInProgress = attribute(
        dtype='DevEnum',
    )

    configurationID = attribute(
        dtype='DevString',
        label="Configuration ID",
        doc="The configuration identifier (string)",
    )

    pstOutputLink = attribute(
        dtype='DevString',
        label="PST output link",
@@ -1281,6 +1294,7 @@ class CspSubarray(SKASubarray):
        # For tests purpose we set it  = 10
        self._config_delay_expected = 10
        self._scan_id = 0
        self._configuration_id = ''
        # connect to TANGO DB
        
        # use defaultdict to initialize the sub-element State,healthState
@@ -1876,6 +1890,14 @@ class CspSubarray(SKASubarray):
        return self._failure_raised
        # PROTECTED REGION END #    //  CspSubarray.cmdAlarmRaised_read

    def read_isCmdInProgress(self):
        # PROTECTED REGION ID(CspSubarray.isCmdInProgress_read) ENABLED START #
        """Return the isCmdInProgress attribute."""
        if all(value == CmdExecState.IDLE for value in self._cmd_execution_state.values()):
            return False
        return True
        # PROTECTED REGION END #    //  CspSubarray.isCmdInProgress_read

    def read_cmdFailureMessage(self):
        # PROTECTED REGION ID(CspSubarray.cmdFailureMessage_read) ENABLED START #
        """Return the cmdFailureMessage attribute."""
@@ -1894,6 +1916,13 @@ class CspSubarray(SKASubarray):
        self._list_dev_completed_task[self._last_executed_command]
        # PROTECTED REGION END #    //  CspSubarray.listOfDevCompletedTask_read

    def read_configurationID(self):
        # PROTECTED REGION ID(CspSubarray.configurationID_read) ENABLED START #
        """Return the configurationID attribute."""
        return self._configuration_id
        # PROTECTED REGION END #    //  CspSubarray.configurationID_read


    # --------
    # Commands
    # --------
@@ -1913,11 +1942,13 @@ class CspSubarray(SKASubarray):
        """
        Starts the scan.

        :param argin: empty string. Input parameter is not used.
        :param argin: the scanID number.
        :type: 'DevVarStringArray'

        :return: None
        """
        self._scan_id = int(argin)
        self.logger.info("Received scan {}".format(self._scan_id))
        # invoke the constructor for the command thread
        self.logger.info("Received Scan command!!")
        for device in self._sc_subarray_assigned_fqdn:
@@ -1947,7 +1978,7 @@ class CspSubarray(SKASubarray):
            self._command_thread['scan'].start()
        # PROTECTED REGION END #    //  CspSubarray.Scan    
        
    def _validate_scan_configuration(self, argin):
    def validate_scan_configuration(self, argin):
        """
        This method is overwritten in each CspSubarray instance.
        
@@ -1955,7 +1986,28 @@ class CspSubarray(SKASubarray):
        :return: None
        :raises: tango.DevFailed exception
        """
        pass

        try:
            json_dict = json.loads(argin)
            if "id" not in json_dict:
                msg = ("Command failed: No configuration ID in JSON object")
                self.logger.error(msg)
                tango.Except.throw_exception("Command failed",
                                             msg,
                                             "ConfigureScan execution",
                                             tango.ErrSeverity.ERR)
            self._configuration_id = json_dict["id"]
            self.logger.info("Processing configuration {}".format(self._configuration_id))

        except json.JSONDecodeError as e:  # argument not a valid JSON object
            # this is a fatal error
            msg = ("Scan configuration object is not a valid JSON object."
                   "Aborting configuration:{}".format(str(e)))
            self.logger.error(msg)
            tango.Except.throw_exception("Command failed",
                                         msg,
                                         "ConfigureScan execution",
                                         tango.ErrSeverity.ERR)
        
    @AdminModeCheck('Configure')
    def is_Configure_allowed(self):
@@ -2010,7 +2062,7 @@ class CspSubarray(SKASubarray):
                except Exception as e:
                    self.logger.warning(str(e))
            # go ahead and parse the received configuration
            self._validate_scan_configuration(argin)
            self.validate_scan_configuration(argin)
        except tango.DevFailed as tango_err:
            # validation failure
            msg = "Failure during validation of configuration:{}".format(tango_err.args[0].desc)
@@ -2068,6 +2120,9 @@ class CspSubarray(SKASubarray):
                proxy.command_inout_asynch("ConfigureScan",
                                           self._sc_subarray_scan_configuration[device],
                                           self._cmd_ended_cb)
                self.logger.info("Exec state command flag is {}".format(self._sc_subarray_cmd_exec_state[device]['configurescan']))
                # Note: check if callaback executed...
                if self._sc_subarray_cmd_exec_state[device]['configurescan'] != CmdExecState.FAILED:
                    self._sc_subarray_cmd_exec_state[device]['configurescan'] = CmdExecState.RUNNING
            except tango.DevFailed as tango_err:
                if device == self.CbfSubarray:
+18 −2
Original line number Diff line number Diff line
<?xml version="1.0" encoding="ASCII"?>
<pogoDsl:PogoSystem xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:pogoDsl="http://www.esrf.fr/tango/pogo/PogoDsl">
  <classes name="CspSubarray" pogoRevision="9.6">
    <description description="CSP subarray functionality is modeled via a TANGO CSP.LMC Common Class for the CSPSubarray TANGO Device." title="CSP.LMC Common CspSubarray" sourcePath="/home/softir/src/ska-git/csp-lmc/csp-lmc-common/pogo" language="PythonHL" filestogenerate="XMI   file,Code files,Protected Regions" license="GPL" copyright="INAF - SKA Telescope" hasMandatoryProperty="false" hasConcreteProperty="true" hasAbstractCommand="false" hasAbstractAttribute="false">
    <description description="CSP subarray functionality is modeled via a TANGO CSP.LMC Common Class for the CSPSubarray TANGO Device." title="CSP.LMC Common CspSubarray" sourcePath="/home/softir/ska-git/csp-lmc/csp-lmc-common/pogo" language="PythonHL" filestogenerate="XMI   file,Code files,Protected Regions" license="GPL" copyright="INAF - SKA Telescope" hasMandatoryProperty="false" hasConcreteProperty="true" hasAbstractCommand="false" hasAbstractAttribute="false">
      <inheritances classname="Device_Impl" sourcePath=""/>
      <inheritances classname="SKAObsDevice" sourcePath="../../../lmc-base-classes/pogo"/>
      <inheritances classname="SKASubarray" sourcePath="/home/softir/src/ska-git/lmc-base-classes/pogo"/>
      <inheritances classname="SKASubarray" sourcePath="/home/softir/ska-git/lmc-base-classes/pogo"/>
      <identification contact="at inaf.it - elisabetta.giani" author="elisabetta.giani" emailDomain="inaf.it" classFamily="SkaCsp" siteSpecific="" platform="All Platforms" bus="Not Applicable" manufacturer="INAF" reference=""/>
    </description>
    <classProperties name="PSTBeams" description="PST sub-element PSTBeams TANGO devices FQDNs">
@@ -670,6 +670,22 @@
      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
      <properties description="The failure message on command execution" label="The failure message" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
    </attributes>
    <attributes name="isCmdInProgress" attType="Scalar" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="" maxY="" allocReadMember="true" isDynamic="false">
      <dataType xsi:type="pogoDsl:BooleanType"/>
      <changeEvent fire="false" libCheckCriteria="false"/>
      <archiveEvent fire="false" libCheckCriteria="false"/>
      <dataReadyEvent fire="false" libCheckCriteria="true"/>
      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
      <properties description="" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
    </attributes>
    <attributes name="configurationID" attType="Scalar" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="" maxY="" allocReadMember="true" isDynamic="false">
      <dataType xsi:type="pogoDsl:StringType"/>
      <changeEvent fire="false" libCheckCriteria="false"/>
      <archiveEvent fire="false" libCheckCriteria="false"/>
      <dataReadyEvent fire="false" libCheckCriteria="true"/>
      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
      <properties description="The configuration identifier (string)" label="Configuration ID" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
    </attributes>
    <attributes name="assignedResources" attType="Spectrum" rwType="READ" displayLevel="OPERATOR" polledPeriod="1000" maxX="100" maxY="" allocReadMember="true">
      <dataType xsi:type="pogoDsl:StringType"/>
      <changeEvent fire="false" libCheckCriteria="false"/>