Commit 097993be authored by Elisabetta Giani's avatar Elisabetta Giani
Browse files

fix-bug-forwarded-attributes: Removed forwarded attribute for Capability addresses.

Issues when the root attribute is a TANGO Spectrum of DevString (free problem).
Moved REceptorsMonitor device to VCCsMonitor device.
Updated json config file for CSP.LMC Common and Mid.CSP.LMC.
Added tests to read the addresses of the Capabilities devices.
parent c119aac2
Loading
Loading
Loading
Loading
Loading
+65 −5
Original line number Diff line number Diff line
@@ -122,24 +122,71 @@ class CspCapabilityMonitor(SKABaseDevice):
        SKABaseDevice.init_device(self)
        # PROTECTED REGION ID(CspCapabilityMonitor.init_device) ENABLED START #
        self.set_state(tango.DevState.INIT)
        self._capability_fqdn = self.CapabilityDevices

        # _capability_fqdn
        # Python list of the FQDNs of the Capability devices 
        self._capability_fqdn = []

        # _capability_proxies
        # Python dictionary  with the proxies the Capability devices 
        # keys: capability fqdn
        # values: tango proxy
        self._capability_proxies = {}

        # _event_id
        # Python dictionary  with the event ids of the subscribed attributes 
        # keys: capability fqdn
        # values: event id
        self._event_id = defaultdict(lambda: defaultdict(lambda: 0))


        # _capability_state
        # Python dictionary  with the State of each capability
        # keys: capability fqdn
        # values: capability device State
        self._capability_state = {}

        # _capability_health_state
        # Python dictionary  with the healthState of each capability
        # keys: capability fqdn
        # values: capability healthState
        self._capability_health_state = {}

        # _capability_admin_mode
        # Python dictionary  with the adminMode of each capability
        # keys: capability fqdn
        # values: capability adminMode
        self._capability_admin_mode = {}

        # _capability_obs_state
        # Python dictionary  with the obsSate of each capability
        # keys: capability fqdn
        # values: capability obsState
        self._capability_obs_state = {} 

        # _capability_membership
        # Python dictionary with the subarray affiliation (subarrayID
        # value) of each capability
        # keys: capability fqdn
        # values: capability affiliation (= subarrayID, 0 if not assigned to
        #         any subarray)
        self._capability_membership = {}
        self._capability_proxies = {}

        # self.CapabilityDevices type is <class 'tango._tango.StdStringVector'>
        # copy to a Python list
        for fqdn in self.CapabilityDevices: 
            self._capability_fqdn.append(fqdn)
        
        # initialization
        self._unassigned_ids = [0]* len(self._capability_fqdn)
        self._capability_state = {fqdn:tango.DevState.DISABLE for fqdn in self._capability_fqdn}
        self._capability_health_state = {fqdn:HealthState.UNKNOWN for fqdn in self._capability_fqdn}
        self._capability_admin_mode = {fqdn:AdminMode.NOT_FITTED for fqdn in self._capability_fqdn}
        self._capability_obs_state = {fqdn:ObsState.IDLE for fqdn in self._capability_fqdn} 
        self._capability_membership = {fqdn:0 for fqdn in self._capability_fqdn}
        self._csp_tango_db = 0

        # establish connection with the CSP.LMC TANGO DB
        self._csp_tango_db = 0
        self._csp_tango_db = tango.Database()
        attribute_properties = self._csp_tango_db.get_device_attribute_property(self.get_name(),
                                                                          {'adminMode': ['__value']})
@@ -253,9 +300,11 @@ class CspCapabilityMonitor(SKABaseDevice):
        """
        # PROTECTED REGION ID(CspCapabilityMonitor.delete_device) ENABLED START #
        for fqdn in self._capability_fqdn:
            self.logger.info("delete: {}".format(fqdn))
            event_to_remove = []
            try:
                for ev_id in self._event_id[fqdn]:
                    self.logger.info("ev_id:{}".format(ev_id))
                    try: 
                        self._capability_proxies[fqdn].unsubscribe_event(ev_id)
                        event_to_remove.append(ev_id)
@@ -265,6 +314,7 @@ class CspCapabilityMonitor(SKABaseDevice):
                                                             fqdn,
                                                             key_err))
                        self.logger.error(msg)
                self.logger.info(event_to_remove)
                # remove the events id from the list
                for k in event_to_remove:
                    self._event_id[fqdn].remove(k)
@@ -274,16 +324,26 @@ class CspCapabilityMonitor(SKABaseDevice):
                else:
                    # remove the dictionary element
                    self._event_id.pop(fqdn)
                    self.logger.info(self._event_id)
            except KeyError as key_err:
                msg = " Can't retrieve the information of key {}".format(key_err)
                self.logger.error(msg)
            
        self._capability_fqdn.clear()
        self.logger.info("1")
        self.logger.info("self._capability_fqdn:{}".format(self._capability_fqdn))
        self.logger.info("self._capability_fqdn:{}".format(type(self._capability_fqdn)))
        #self._capability_fqdn.clear()
        self.logger.info("2")
        self._capability_state.clear()
        self.logger.info("3")
        self._capability_health_state.clear()
        self.logger.info("4")
        self._capability_admin_mode.clear()
        self.logger.info("5")
        self._capability_obs_state.clear() 
        self.logger.info("6")
        self._capability_membership.clear()
        self.logger.info("7")
        # PROTECTED REGION END #    //  CspCapabilityMonitor.delete_device
    # ------------------
    # Attributes methods
+87 −30
Original line number Diff line number Diff line
@@ -67,18 +67,6 @@ class CspMaster(SKAMaster):
            - TANGO FQDN of the  CSP.LMC Subarrays
            - Type:'DevVarStringArray'
    
        SearchBeams
            - TANGO FQDN of the CSP.LMC SearchBeam Capabilities
            - Type:'DevVarStringArray'
    
        TimingBeams
            - TANGO FQDN of the CSP.LMC TimingBeam Capabilities
            - Type:'DevVarStringArray'
    
        VlbiBeams
            - TANGO FQDN of the CSP.LMC Vlbi Capabilities
            - Type:'DevVarStringArray'
        
        SearchBeamsMonitor
            - TANGO Device to monitor the CSP SearchBeams Capability\ndevices.
            - Type:'DevString'
@@ -406,6 +394,7 @@ class CspMaster(SKAMaster):
            proxy = proxy_list[device_fqdn]
            # ping the device to control if is alive
            proxy.ping()
            return True
        except KeyError as key_err:
            # Raised when a mapping (dictionary) key is not found in the set
            # of existing keys.
@@ -415,7 +404,6 @@ class CspMaster(SKAMaster):
            return False
        except tango.DevFailed:
            return False
        return True
         
    def _issue_power_command(self, device_list, **args_dict):
        """
@@ -642,11 +630,15 @@ class CspMaster(SKAMaster):
                                             "write adminMode", tango.ErrSeverity.ERR)
    def _connect_capabilities_monitor(self):
        """
        Protected Class method.

        Establish connecton with the TANGO devices performing the monitor of the CSP
        Element Capabilities.
        """
        # build the list with the Capability monitor devices
        for fqdn in self._capability_fqdn:
        for fqdn in self._capability_monitor_fqdn:
            try:
                self._capability_proxy[fqdn] = tango.DeviceProxy(fqdn)
                self._capability_monitor_proxy[fqdn] = tango.DeviceProxy(fqdn)
            except tango.DevFailed as tango_err:
                self.logger.warning(tango_err.args[0].desc)
            
@@ -964,6 +956,28 @@ class CspMaster(SKAMaster):
        doc="Alarm message when the Standby command fails with error(s).",
    )

    searchBeamsAddresses = attribute(
        dtype=('DevString',),
        max_dim_x=1500,
        label="Search Beam Capabilities Addresses",
        doc="The SearchBeam Capabilityies FQDNs",
    )

    timingBeamsAddresses = attribute(
        dtype=('DevString',),
        max_dim_x=16,
        label="Timing Beams Capability Addresses",
        doc="The list of Timing Beam Capabilities FQDNs",
    )

    vlbiBeamsAddresses = attribute(
        dtype=('DevString',),
        max_dim_x=20,
        label="Vlbi Beam Capabilities Addresses",
        doc="The list of VlbiBeam Capabilities FQDNs",
    )


    reportSearchBeamState = attribute(
        dtype=('DevState',),
        max_dim_x=1500,
@@ -1110,18 +1124,6 @@ class CspMaster(SKAMaster):
        label="VlbiBeam Capabilities adminMode",
        forwarded=True
    )
    searchBeamAddresses = attribute(name="searchBeamAddresses",
        label="SearchBeams Capability devices addresses",
        forwarded=True
    )
    timingBeamAddresses = attribute(name="timingBeamAddresses",
        label="TimingBeams Capability devices addresses",
        forwarded=True
    )
    vlbiBeamAddresses = attribute(name="vlbiBeamAddresses",
        label="VlbiBeams Capability devices addresses",
        forwarded=True
    )
    
    unassignedVlbiBeamIDs = attribute(name="unassignedVlbiBeamIDs",
        label="Unassigned VlbiBeam Capabilities IDs",
@@ -1349,10 +1351,10 @@ class CspMaster(SKAMaster):
        # _capability_proxy: dictionary 
        # keys: the Capability Monitor devices FQDNs
        # values: DeviceProxy proxies
        self._capability_proxy = {}
        self._capability_monitor_proxy = {}

        # _capability_fqdn: list of CapabilityMonitor FQDN devices
        self._capability_fqdn = []
        self._capability_monitor_fqdn = []

        # Try connection with sub-elements
        self._connect_to_subelements()
@@ -1714,10 +1716,65 @@ class CspMaster(SKAMaster):
        return ('',)
        # PROTECTED REGION END #    //  CspMaster.reservedSearchBeamIDs_read

    def read_searchBeamsAddresses(self):
        # PROTECTED REGION ID(CspMaster.searchBeamsAddresses_read) ENABLED START #
        """Return the searchBeamsAddresses attribute.
           This attribute stores the list of the SearchBeams Capabilities TANGO
           addresses (FQDNs)
        """
        self.logger.info(self._capability_monitor_fqdn)
        if not self._is_device_running(self.SearchBeamsMonitor, self._capability_monitor_proxy):
            return ('',)
        try:
            proxy = self._capability_monitor_proxy[self.SearchBeamsMonitor]
            return proxy.capabilityAddresses
        except tango.DevFailed as tango_err:
            msg = "Attribute reading failure: {}".format(df.args[0].desc)
            self.logger.error(msg)
            tango.Except.throw_exception("Attribute reading failure", msg,
                                         "read_searchBeamsAddresses", tango.ErrSeverity.ERR)
        # PROTECTED REGION END #    //  CspMaster.searchBeamsAddresses_read

    def read_timingBeamsAddresses(self):
        # PROTECTED REGION ID(CspMaster.timingBeamsAddresses_read) ENABLED START #
        """Return the timingBeamsAddresses attribute.
           This attribute stores the list of the TimingBeams Capabilities TANGO
           addresses (FQDNs)
        """
        if not self._is_device_running(self.TimingBeamsMonitor, self._capability_monitor_proxy):
            return ('',)
        try:
            proxy = self._capability_monitor_proxy[self.TimingBeamsMonitor]
            return proxy.capabilityAddresses
        except tango.DevFailed as tango_err:
            msg = "Attribute reading failure: {}".format(df.args[0].desc)
            self.logger.error(msg)
            tango.Except.throw_exception("Attribute reading failure", msg,
                                         "read_timingBeamsAddresses", tango.ErrSeverity.ERR)
        # PROTECTED REGION END #    //  CspMaster.timingBeamsAddresses_read

    def read_vlbiBeamsAddresses(self):
        # PROTECTED REGION ID(CspMaster.vlbiBeamsAddresses_read) ENABLED START #
        """Return the vlbiBeamsAddresses attribute.
           This attribute stores the list of the VlbiBeams Capabilities TANGO
           addresses (FQDNs)
        """
        if not self._is_device_running(self.VlbiBeamsMonitor, self._capability_monitor_proxy):
            return ('',)
        try:
            proxy = self._capability_monitor_proxy[self.VlbiBeamsMonitor]
            return proxy.capabilityAddresses
        except tango.DevFailed as tango_err:
            msg = "Attribute reading failure: {}".format(df.args[0].desc)
            self.logger.error(msg)
            tango.Except.throw_exception("Attribute reading failure", msg,
                                         "read_vlbiBeamsAddresses", tango.ErrSeverity.ERR)
        # PROTECTED REGION END #    //  CspMaster.vlbiBeamsAddresses_read

    # --------
    # Commands
    # --------

    @AdminModeCheck('On')
    def is_On_allowed(self):
        """
+0 −15
Original line number Diff line number Diff line
@@ -89,21 +89,6 @@
                                    "common/elt/vlbi_beams_monitor/capabilityAdminMode"
                                ]
			    },
			    "searchBeamAddresses": {
				"__root_att": [
                                    "common/elt/search_beams_monitor/capabilityAddresses"
                                ]
			    },
			    "timingBeamAddresses": {
				"__root_att": [
                                    "common/elt/timing_beams_monitor/capabilityAddresses"
                                ]
			    },
			    "vlbiBeamAddresses": {
				"__root_att": [
                                    "common/elt/vlbi_beams_monitor/capabilityAddresses"
                                ]
			    },
			    "unassignedSearchBeamIDs": {
				"__root_att": [
                                    "common/elt/search_beams_monitor/unassignedIDs"
+24 −9
Original line number Diff line number Diff line
@@ -577,6 +577,30 @@
      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
      <properties description="For each sub-array idm reports the list of the reserved SearchBeam IDs" label="SearchBeams reserved IDS" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
    </attributes>
    <attributes name="searchBeamsAddresses" attType="Spectrum" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="1500" 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 SearchBeam Capabilityies FQDNs" label="Search Beam Capabilities Addresses" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
    </attributes>
    <attributes name="timingBeamsAddresses" attType="Spectrum" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="16" 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 list of Timing Beam Capabilities FQDNs" label="Timing Beams Capability Addresses" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
    </attributes>
    <attributes name="vlbiBeamsAddresses" attType="Spectrum" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="20" 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 list of VlbiBeam Capabilities FQDNs" label="Vlbi Beam Capabilities Addresses" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
    </attributes>
    <forwardedAttributes name="reportSearchBeamState" label="SearchBeam Capabilities State">
      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
    </forwardedAttributes>
@@ -613,15 +637,6 @@
    <forwardedAttributes name="reportVlbiBeamAdminMode" label="VlbiBeam Capabilities adminMode">
      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
    </forwardedAttributes>
    <forwardedAttributes name="searchBeamAddresses" label="SearchBeams Capability devices addresses">
      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
    </forwardedAttributes>
    <forwardedAttributes name="timingBeamAddresses" label="TimingBeams Capability devices addresses">
      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
    </forwardedAttributes>
    <forwardedAttributes name="vlbiBeamAddresses" label="VlbiBeams Capability devices addresses">
      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
    </forwardedAttributes>
    <forwardedAttributes name="unassignedVlbiBeamIDs" label="Unassigned VlbiBeam Capabilities IDs">
      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
    </forwardedAttributes>
+2 −2
Original line number Diff line number Diff line
@@ -154,7 +154,7 @@ class TestCspMaster(object):
        # issue the "On" command on CbfTestMaster device
        argin = [tango_context.device.cbfMasterAddress,]
        tango_context.device.On(argin)
        time.sleep(3)
        time.sleep(4)
        assert tango_context.device.cspCbfState == DevState.ON

    def test_on_command_duration(self, tango_context):
@@ -176,7 +176,7 @@ class TestCspMaster(object):
        # issue the "On" command on CbfTestMaster device
        argin = [tango_context.device.cbfMasterAddress,]
        tango_context.device.Standby(argin)
        time.sleep(3)
        time.sleep(4)
        assert tango_context.device.cspCbfState == DevState.STANDBY

    def test_standby_command_duration(self, tango_context):
Loading