Commit 1120d5bd authored by Elisabetta Giani's avatar Elisabetta Giani
Browse files

CT-60: Use base classes 0.6.2.

Add/Remove receptors command classes now inherit from Assign/ReleaseResources
command classes.
Updated mid cbf DB configuration file to reduce VCC membership polling
(to reduce the latency in unassignedReceptorIDs attribute update). Fixed also
a bug in one MID CBF device name.
Updated the tests for MidCspSubarray.
parent e61b5520
Loading
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -38,7 +38,7 @@ setup(
        install_requires = [
            'pytango >=9.3.1',
            'future',
            'lmcbaseclasses==0.6.0+84c20201',
            'lmcbaseclasses==0.6.2+a1461091'
        ],
        setup_requires=[
            'pytest-runner',
+32 −119
Original line number Diff line number Diff line
@@ -38,75 +38,18 @@ from tango import AttrWriteType, DeviceProxy
# Additional import
# PROTECTED REGION ID(MidCspSubarray.additional_import) ENABLED START #
#from ska.base import SKAMaster
from ska.base import SKASubarray, SKASubarrayStateModel
from ska.base.commands import ActionCommand, ResponseCommand, ResultCode
from ska.base.faults import CapabilityValidationError
from ska.base.control_model import HealthState, AdminMode, ObsState
# import CSP.LMC Common package
from csp_lmc_common.utils.cspcommons import CmdExecState
from csp_lmc_common.utils.decorators import AdminModeCheck, ObsStateCheck, SubarrayRejectCmd
#from csp_lmc_common.utils.decorators import AdminModeCheck, ObsStateCheck, SubarrayRejectCmd
from csp_lmc_common.CspSubarray import CspSubarray, CspSubarrayStateModel
# PROTECTED REGION END #    //  MidCspSubarrayBase.additionnal_import

__all__ = ["MidCspSubarrayBase", "main"]

class MidCspSubarrayStateModel(CspSubarrayStateModel):
    _mid_subarray_transitions = {
        ('RESOURCING', 'add_receptors_succeeded'): (
        "IDLE",
        lambda self: self._set_obs_state(ObsState.IDLE)
        ),
        ('EMPTY', 'add_receptors_started'): (
        "RESOURCING",
        lambda self: self._set_obs_state(ObsState.RESOURCING)
        ),
     ('IDLE', 'add_receptors_started'): (
        "RESOURCING",
        lambda self: self._set_obs_state(ObsState.RESOURCING)
    ),
    ('EMPTY', 'add_receptors_failed'): (
        "OBSFAULT",
        lambda self: self._set_dev_state(DevState.FAULT)
    ),
    ('IDLE', 'add_receptors_failed'): (
        "OBSFAULT",
        lambda self: self._set_dev_state(DevState.FAULT)
    ),
     ('IDLE', 'remove_receptors_started'): (
        "RESOURCING",
        lambda self: self._set_obs_state(ObsState.RESOURCING)
    ),
    ('IDLE', 'remove_receptors_failed'): (
        "OBSFAULT",
        lambda self: self._set_dev_state(DevState.FAULT)
    ),
        ('RESOURCING', 'remove_receptors_succeeded'): (
        "IDLE",
        lambda self: self._set_obs_state(ObsState.IDLE)
    ),
     ('IDLE', 'removeall_receptors_started'): (
        "RESOURCING",
        lambda self: self._set_obs_state(ObsState.RESOURCING)
    ),
    ('IDLE', 'removeall_receptors_failed'): (
        "OBSFAULT",
        lambda self: self._set_dev_state(DevState.FAULT)
    ),
        ('RESOURCING', 'remove_receptors_succeeded'): (
        "IDLE",
        lambda self: self._set_obs_state(ObsState.IDLE)
    ),
    }

    def __init__(self, dev_state_callback=None):
        """
        Initialises the model. Note that this does not imply moving to
        INIT state. The INIT state is managed by the model itself.
        """
        super().__init__(
            dev_state_callback=dev_state_callback,
        )
        self.update_transitions(self._mid_subarray_transitions)

class MidCspSubarrayBase(CspSubarray):
    """
    The base class for MID CspSubarray.
@@ -151,17 +94,11 @@ class MidCspSubarrayBase(CspSubarray):
    class OnCommand(CspSubarray.OnCommand):
        # NOTE: To remove when CBF Subarray implements the correct state
        def do(self):
            #super().do()
            self.logger.info("On eseguito nel MID")
            return (ResultCode.OK, "On exeguito correttamente")

    class AddReceptorsCommand(ActionCommand):
        def __init__(self, target, state_model, logger=None):

            super().__init__(
                target, state_model, "add_receptors", start_action=True, logger=logger
            )
            self.logger.info("dev_State:{}".format(self.state_model.dev_state))
            super().do()
            return (ResultCode.OK, "On command completed OK")

    class AddReceptorsCommand(SKASubarray.AssignResourcesCommand):
        def do(self, argin):
            device = self.target
            # PROTECTED REGION ID(CspSubarray.AddReceptors) ENABLED START #
@@ -256,7 +193,7 @@ class MidCspSubarrayBase(CspSubarray):
                if device._cmd_execution_state['addreceptors'] != CmdExecState.FAILED:
                    device._cmd_execution_state['addreceptors'] = CmdExecState.RUNNING
                device._command_thread['addreceptors'].start()
                self.logger.info("AddReceptors obsState::{}".format(device._obs_state))
                self.logger.info("AddReceptors obsState::{}".format(device.state_model.obs_state))
                return (ResultCode.STARTED, "AddReceptors Started")
            except tango.DevFailed as tango_err:
                tango.Except.throw_exception("Command failed",
@@ -272,12 +209,7 @@ class MidCspSubarrayBase(CspSubarray):
        #    self.state_model.perform_action(action)
        #    self.logger.info("ObsState:{}".format(self.state_model.obs_state))

    class RemoveReceptorsCommand(ActionCommand):
        def __init__(self, target, state_model, logger=None):

            super().__init__(
                target, state_model, "remove_receptors", start_action=True, logger=logger
            )
    class RemoveReceptorsCommand(SKASubarray.ReleaseResourcesCommand):
        def do(self, argin):
            device = self.target
            # check if the CspSubarray is already connected to the CbfSubarray
@@ -335,6 +267,7 @@ class MidCspSubarrayBase(CspSubarray):
                    else : 
                        return (ResultCode.OK, f"No receptor to remove from subarray {device.get_name()}")
                device._cmd_execution_state['removereceptors'] = CmdExecState.IDLE
                self.logger.info("RemoveREceptors obs_state:{}".format(device.state_model.obs_state))
                return (ResultCode.STARTED, "RemoveReceptor started")
            except tango.DevFailed as tango_err:
                #tango.Except.throw_exception("Command failed",
@@ -352,21 +285,15 @@ class MidCspSubarrayBase(CspSubarray):
                message = str(attr_err)
            return (ResultCode.FAILED, message)    

    '''
    class RemoveAllReceptorsCommand(ActionCommand):
        def __init__(self, target, state_model, logger=None):

            super().__init__(
                target, state_model, "removeall_receptors", start_action=True, logger=logger
            )
        def do(self, argin):
    class RemoveAllReceptorsCommand(SKASubarray.ReleaseAllResourcesCommand):
        def do(self):
            self.logger.info("RemoveAllReceptorsCommand")
            device = self.target
            try: 
                proxy = device._sc_subarray_proxies[device.CbfSubarray]
                # check if the list of assigned receptors is empty
                receptors = proxy.receptors
                if len(receptors):
                   return device.RemoveReceptorsCommand(receptors[:])
                if len(device):
                    receptors = device._get_cbfsubarray_assigned_receptors()
                    return device._remove_receptors_cmd.do(receptors[:])
                return (ResultCode.OK, "No receptor to remove")
            except tango.DevFailed as df:
                log_msg = ("RemoveAllReceptors failure. Reason: {} "
                           "Desc: {}".format(df.args[0].reason,
@@ -374,8 +301,12 @@ class MidCspSubarrayBase(CspSubarray):
                self.logger.error(log_msg)
                return (ResultCode.FAILED, log_msg)    

    '''
    def _get_cbfsubarray_assigned_receptors(self, device_proxy):
    def __len__(self):
        assigned_receptors = self._get_cbfsubarray_assigned_receptors()
        return len(assigned_receptors)


    def _get_cbfsubarray_assigned_receptors(self):
        """

        :param device_proxy: DeviceProxy of the CBF Sub-element subarray
@@ -385,6 +316,7 @@ class MidCspSubarrayBase(CspSubarray):
        try:
            # Note: with numpy support in PyTango, receptors is a
            # numpy array
            device_proxy = self._sc_subarray_proxies[self.CbfSubarray]
            receptors = device_proxy.receptors
        except tango.DevFailed as tango_err:
            self.logger.warning("__monitor_add_receptors:{}".format(tango_err.args[0].desc))
@@ -405,7 +337,7 @@ class MidCspSubarrayBase(CspSubarray):

        while True:
            # read the list of receptor IDs assigned to the CbfSubarray
            receptors = self._get_cbfsubarray_assigned_receptors(device_proxy)
            receptors = self._get_cbfsubarray_assigned_receptors()
            if len(receptors):
                # get the ids in receptor_list that are also in receptor
                receptors_assigned = [value for value in receptors_to_be_added if value in receptors]
@@ -536,6 +468,7 @@ class MidCspSubarrayBase(CspSubarray):
        self._sc_subarray_cmd_exec_state[device][cmd_name] = CmdExecState.IDLE
        self._cmd_execution_state[cmd_name] = CmdExecState.IDLE
        self._remove_receptors_cmd.succeeded()
        self.logger.info("CspSubarray monitor_remove end")

    def validate_scan_configuration(self, argin):
        """
@@ -617,15 +550,6 @@ class MidCspSubarrayBase(CspSubarray):
    def Configure(self, argin):
        CspSubarray.Configure(self, argin)

    def _init_state_model(self):
        """
        Sets up the state model for the device
        """
        self.state_model = MidCspSubarrayStateModel(
            dev_state_callback=self._update_state,
        )
        #self.logger.info("state_mode: {}".format(self.state_model._transitions))

    def init_command_objects(self):
        """
        Sets up the command objects
@@ -637,7 +561,7 @@ class MidCspSubarrayBase(CspSubarray):
        self._remove_receptors_cmd = self.RemoveReceptorsCommand(*args)
        self.register_command_object("AddReceptors", self.AddReceptorsCommand(*args))
        self.register_command_object("RemoveReceptors", self.RemoveReceptorsCommand(*args))
        #self.register_command_object("RemoveAllReceptors", self.RemoveAllReceptorsCommand(*args))
        self.register_command_object("RemoveAllReceptors", self.RemoveAllReceptorsCommand(*args))

    
    # PROTECTED REGION END #    //  MidCspSubarrayBase.private_methods
@@ -855,6 +779,7 @@ class MidCspSubarrayBase(CspSubarray):
                    when an exception is caught during command execution.
        """
        # PROTECTED REGION ID(CspSubarray.RemoveReceptors) ENABLED START #
        self.logger.info("RemoveReceptors method")
        handler = self.get_command_object("RemoveReceptors")
        (result_code, message) = handler(argin)
        return [[result_code], [message]]
@@ -878,22 +803,10 @@ class MidCspSubarrayBase(CspSubarray):
        """
        # PROTECTED REGION ID(CspSubarray.RemoveAllReceptors) ENABLED START #

        try:
            proxy = self._sc_subarray_proxies[self.CbfSubarray]
            # check if the list of assigned receptors is empty
            receptors = proxy.receptors
            if len(receptors):
                handler = self.get_command_object("RemoveReceptors")
                (result_code, message) = handler(receptors[:])
        self.logger.info("RemoveAllReceptors method")
        handler = self.get_command_object("RemoveAllReceptors")
        (result_code, message) = handler()
        return [[result_code], [message]]
            return (ResultCode.OK, "RemoveAllReceptors: no receptor to remove!")
        except tango.DevFailed as df:
            log_msg = ("RemoveAllReceptors failure. Reason: {} "
                           "Desc: {}".format(df.args[0].reason,
                                             df.args[0].desc))
            self.logger.error(log_msg)
            return (ResultCode.FAILED, log_msg)    

        # PROTECTED REGION END #    //  MidCspSubarrayBase.RemoveAllReceptors

# ----------
+6 −6
Original line number Diff line number Diff line
@@ -50,7 +50,7 @@
                                "receptortovcc",
                                "1000",
                                "reportvccsubarraymembership",
                                "1000",
                                "200",
                                "reportfspCorrSubarraymembership",
                                "1000",
                                "reportfsphealthstate",
@@ -288,7 +288,7 @@
                                "mid_csp_cbf/pssconfig/02"
                            ],
                            "CorrConfigAddress": [
                                "mid_csp_cbf/corrconfig/02"
                                "mid_csp_cbf/corrconfig/01"
                            ],
                            "SubID": [
                                "2"
@@ -435,7 +435,7 @@
                                "state",
                                "1000",
                                "subarraymembership",
                                "200"
                                "1000"
                            ]
                        }
                    }
@@ -600,7 +600,7 @@
                                "state",
                                "1000",
                                "subarraymembership",
                                "200"
                                "1000"
                            ]
                        }
                    }
@@ -765,7 +765,7 @@
                                "state",
                                "1000",
                                "subarraymembership",
                                "200"
                                "1000"
                            ]
                        }
                    }
@@ -930,7 +930,7 @@
                                "state",
                                "1000",
                                "subarraymembership",
                                "200"
                                "1000"
                            ]
                        }
                    }
+2 −0
Original line number Diff line number Diff line
@@ -61,6 +61,8 @@ setup(
            'pytest-json-report',
            'pycodestyle',
            'assertpy',
            'pytest-forked',
            'mock',
        ],
        extras_require={
            'dev':  ['prospector[with_pyroma]', 'yapf', 'isort']
+200 −127

File changed.

Preview size limit exceeded, changes collapsed.