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

AT5-259: Added command GoToIdle.

CspSubarray moves to CONFIGURING and SCANNING only when the sub-components
have moved to CONFIGURING or SCANNING.
Add test for MidCspSubarray.
parent f5d45ba5
Loading
Loading
Loading
Loading
+51 −31
Original line number Diff line number Diff line
@@ -515,7 +515,6 @@ class CspSubarray(with_metaclass(DeviceMeta,SKASubarray)):
        # flag to signal when configuration ends on a sub-array sub-component
        device_done = defaultdict(lambda:False)
        elapsed_time = 0
        counter = 0
        starting_time = time.time()
        self._end_scan_event.clear()
        # inside the end-less lop check the obsState of each sub-component
@@ -523,12 +522,15 @@ class CspSubarray(with_metaclass(DeviceMeta,SKASubarray)):
            # Note: CbfSubarray changes the obsState value after forwarding the command
            # (synchrnously) to FSP and VCC devices. This means that When the thread function enters,
            # the loop, the obsState is still READY and the function exits immediately.
            # Addingt the wait delay here let the CbfSubarray to change the obsState and 
            # Adding the wait delay here let the CbfSubarray to change the obsState and 
            # generate the event.
            # Need to modify the CbfSubarray behavior
            if self._end_scan_event.is_set() or (elapsed_time >= self._scan_duration):
            # TODO: add check of abort_command_event.
            #if self._abort_command_event.is_set():
            #    dev_successful_state = ObsState.IDLE
            #if self._end_scan_event.is_set() or self._abort_command_event.is_set():
            if self._end_scan_event.is_set():
                for device in device_list:
                    print("scan obs_state:", self._sc_subarray_obs_state[device])
                    if device_done[device] == True:
                        continue
                    # if the sub-component execution flag is no more RUNNING, the command has
@@ -550,16 +552,15 @@ class CspSubarray(with_metaclass(DeviceMeta,SKASubarray)):
                    if self._sc_subarray_cmd_exec_state[device][cmd_name] == CmdExecState.FAILED:
                        # execution ended for this sub-element, skip to the next one
                        device_done[device] = True
            if elapsed_time > self._scan_duration + 1:
                self.logger.warn("Scan duration time expired. No EndSCan received!!")
                # TODO ??
            # set the CSP to SCANNING only when all sub-element are in SCANNING.
            # Note: CBF mobes to SCANNING only when delay models have been provided.
            if all(self._sc_subarray_obs_state[device] == ObsState.SCANNING for device in device_list):
                self._obs_state = ObsState.SCANNING
            if any(device_done.values()) and all(value == True for value in device_done.values()):
                self.logger.info("All devices have been handled!")
                break
            time.sleep(1)
            elapsed_time = time.time() - starting_time
            counter = int(elapsed_time*100/self._scan_duration)
            self._cmd_progress[cmd_name] = counter
                       
        # end of the while loop
        # check for timeout/alarm conditions on each sub-component
        for device in device_list:
@@ -571,6 +572,9 @@ class CspSubarray(with_metaclass(DeviceMeta,SKASubarray)):
        if all(self._sc_subarray_obs_state[fqdn] == dev_successful_state for fqdn in device_list):
            self._obs_state = dev_successful_state
            self._cmd_progress[cmd_name] = 100
            elapsed_time = time.time() - starting_time 
            self.logger.info("Scan elapsed time:{}".format(elapsed_time))
        self._cmd_execution_state['scan'] = CmdExecState.IDLE
        self._last_executed_command = cmd_name
        
    def __configure_scan(self, device_list, **args_dict):
@@ -651,6 +655,8 @@ class CspSubarray(with_metaclass(DeviceMeta,SKASubarray)):
                self._cmd_progress[cmd_name] = command_progress+ self._sc_subarray_cmd_progress[device][cmd_name]/len(device_list)
                self.logger.debug("Command {} obsState {}:".format(cmd_name,device,
                                                                   self._sc_subarray_cmd_exec_state[device][cmd_name]))
            if all(self._sc_subarray_obs_state[device] == ObsState.CONFIGURING for device in device_list):
                self._obs_state = ObsState.CONFIGURING
            if all(value == True for value in device_done.values()):
                self.logger.info("All devices have been handled!")
                #if (all(self._sc_subarray_obs_state[device] == ObsState.READY for device in device_list)):
@@ -1840,7 +1846,6 @@ class CspSubarray(with_metaclass(DeviceMeta,SKASubarray)):
    # --------

    @AdminModeCheck('Scan')
    @ObsStateCheck('scan')
    def is_Scan_allowed(self):
        return self._is_subarray_configuring_allowed()   
                            
@@ -1848,22 +1853,19 @@ class CspSubarray(with_metaclass(DeviceMeta,SKASubarray)):
        dtype_in='DevVarStringArray',
    )
    @DebugIt()
    @ObsStateCheck('scan')
    @SubarrayRejectCmd(['ConfigureScan', 'EndSB'])
    def Scan(self, argin):
        # PROTECTED REGION ID(CspSubarray.Scan) ENABLED START #
        """
        Starts the scan.

        :param argin: the total scan duration time in sec.
        :param argin: empty string. Input parameter is not used.
        :type: 'DevVarStringArray'

        :return:None
        """
        # invoke the constructor for the command thread
        self._cmd_progress['scan'] = 0
        json_scan_duration = json.loads(argin[0])
        self._scan_duration = int(json_scan_duration['scanDuration'])
        self.logger.info("Scan:duration value = {}".format(self._scan_duration))
        
        for device in self._sc_subarray_assigned_fqdn:
            try:
                proxy = self._sc_subarray_proxies[device]
@@ -1887,7 +1889,8 @@ class CspSubarray(with_metaclass(DeviceMeta,SKASubarray)):
                                                           name="Thread-Scan",
                                                           args=(self._sc_subarray_assigned_fqdn,))
            self._command_thread['scan'].start()
            self._obs_state = ObsState.SCANNING
            #self._obs_state = ObsState.SCANNING
            self._cmd_execution_state['scan'] = CmdExecState.RUNNING
            # sleep for a while to let the thread start
            time.sleep(0.2)
        # PROTECTED REGION END #    //  CspSubarray.Scan    
@@ -1903,7 +1906,6 @@ class CspSubarray(with_metaclass(DeviceMeta,SKASubarray)):
        pass
        
    @AdminModeCheck('ConfigureScan')
    @ObsStateCheck('configscan')
    def is_ConfigureScan_allowed(self):
        return self._is_subarray_configuring_allowed()   
                     
@@ -1912,6 +1914,7 @@ class CspSubarray(with_metaclass(DeviceMeta,SKASubarray)):
        doc_in="A Json-encoded string with the scan configuration.",
    )
    @DebugIt()
    @ObsStateCheck('configscan')
    @SubarrayRejectCmd(['AddSearchBeams',
                       'RemoveSearchBeams',
                       'AddTimingBeams',
@@ -1991,7 +1994,8 @@ class CspSubarray(with_metaclass(DeviceMeta,SKASubarray)):
            # register the starting time for the command
            self._sc_subarray_cmd_starting_time[device] = time.time()
            print("configure starting time:", self._sc_subarray_cmd_starting_time[device])
        self._obs_state = ObsState.CONFIGURING
        #self._obs_state = ObsState.CONFIGURING
        self._cmd_execution_state['configurescan'] = CmdExecState.RUNNING
        # invoke the constructor for the command thread
        self._command_thread['configurescan'] = threading.Thread(target=self.__configure_scan,
                                                           name="Thread-ConfigureScan",
@@ -2002,7 +2006,6 @@ class CspSubarray(with_metaclass(DeviceMeta,SKASubarray)):
        # PROTECTED REGION END #    //  CspSubarray.ConfigureScan
    
    @AdminModeCheck('AddNumOfSearchBeams')
    @ObsStateCheck('addresources')
    def is_AddNumOfSearchBeams_allowed(self):
        return self._is_subarray_composition_allowed()
        
@@ -2011,6 +2014,7 @@ class CspSubarray(with_metaclass(DeviceMeta,SKASubarray)):
        doc_in="The number of SearchBeams Capabilities to assign to the subarray.",
    )
    @DebugIt()
    @ObsStateCheck('addresources')
    @SubarrayRejectCmd(['RemoveSearchBeams',
                        'RemoveNumOfSearchBeams',
                        'ConfigureScan'])
@@ -2030,7 +2034,6 @@ class CspSubarray(with_metaclass(DeviceMeta,SKASubarray)):
        pass
    
    @AdminModeCheck('RemoveNumOfSearchBeams')
    @ObsStateCheck('removeresources')
    def is_RemoveNumOfSearchBeams_allowed(self):
        return self._is_subarray_composition_allowed()
        
@@ -2039,6 +2042,7 @@ class CspSubarray(with_metaclass(DeviceMeta,SKASubarray)):
        doc_in="The number of SearchBeam Capabilities to remove from the \nCSP sub-array.\nAll the assigned SearcBbeams are removed from the CSP sub-array if the\ninput number is equal to the max number of SearchBeam \nCapabilities for the specified Csp sub-array instance (1500 for MID,\n500 for LOW)",
    )
    @DebugIt()
    @ObsStateCheck('removeresources')
    @SubarrayRejectCmd(['AddSearchBeams', 'ConfigureScan'])
    def RemoveNumOfSearchBeams(self, argin):
        # PROTECTED REGION ID(CspSubarray.RemoveNumOfSearchBeams) ENABLED START #
@@ -2063,7 +2067,6 @@ class CspSubarray(with_metaclass(DeviceMeta,SKASubarray)):

    
    @AdminModeCheck('AddTimingBeams')
    @ObsStateCheck('addresources')
    def is_AddTimingBeams_allowed(self):
        return self._is_subarray_composition_allowed()
    
@@ -2072,6 +2075,7 @@ class CspSubarray(with_metaclass(DeviceMeta,SKASubarray)):
        doc_in="The list of TimingBeam Capability IDs to assign to the CSP sub-array.",
    )
    @DebugIt()
    @ObsStateCheck('addresources')
    @SubarrayRejectCmd(['RemoveTimingBeams', 'ConfigureScan'])
    def AddTimingBeams(self, argin):
        # PROTECTED REGION ID(CspSubarray.AddTimingBeams) ENABLED START #
@@ -2095,7 +2099,6 @@ class CspSubarray(with_metaclass(DeviceMeta,SKASubarray)):
        # PROTECTED REGION END #    //  CspSubarray.AddTimingBeams

    @AdminModeCheck('AddSearchBeams')
    @ObsStateCheck('addresources')
    def is_AddSearchBeams_allowed(self):
        return self._is_subarray_composition_allowed()
    
@@ -2104,6 +2107,7 @@ class CspSubarray(with_metaclass(DeviceMeta,SKASubarray)):
        doc_in="The list of SearchBeam Capability IDs to assign to the CSP sub-array.",
    )
    @DebugIt()
    @ObsStateCheck('addresources')
    @SubarrayRejectCmd(['RemoveSearchBeams', 'ConfigureScan'])
    def AddSearchBeams(self, argin):
        # PROTECTED REGION ID(CspSubarray.AddSearchBeams) ENABLED START #
@@ -2127,7 +2131,6 @@ class CspSubarray(with_metaclass(DeviceMeta,SKASubarray)):
        # PROTECTED REGION END #    //  CspSubarray.AddSearchBeams

    @AdminModeCheck('RemoveSearchBeams')
    @ObsStateCheck('removeresources')
    def is_RemoveSearchBeams_allowed(self):
        return self._is_subarray_composition_allowed()
    
@@ -2136,6 +2139,7 @@ class CspSubarray(with_metaclass(DeviceMeta,SKASubarray)):
        doc_in="The list of SearchBeam Capability IDs to remove from the CSP sub-array.",
    )
    @DebugIt()
    @ObsStateCheck('removeresources')
    @SubarrayRejectCmd(['AddSearchBeams', 'ConfigureScan'])
    def RemoveSearchBeamsID(self, argin):
        # PROTECTED REGION ID(CspSubarray.RemoveSearchBeamsID) ENABLED START #
@@ -2154,7 +2158,6 @@ class CspSubarray(with_metaclass(DeviceMeta,SKASubarray)):
        # PROTECTED REGION END #    //  CspSubarray.RemoveSearchBeamsID
        
    @AdminModeCheck('RemoveTimingBeams')
    @ObsStateCheck('removeresources')
    def is_RemoveTimingBeams_allowed(self):
        return self._is_subarray_composition_allowed()
    
@@ -2163,6 +2166,7 @@ class CspSubarray(with_metaclass(DeviceMeta,SKASubarray)):
        doc_in="The list of Timing Beams IDs to remove from the sub-array.",
    )
    @DebugIt()
    @ObsStateCheck('removeresources')
    @SubarrayRejectCmd(['AddTimingBeams', 'ConfigureScan'])
    def RemoveTimingBeams(self, argin):
        # PROTECTED REGION ID(CspSubarray.RemoveTimingBeams) ENABLED START #
@@ -2178,13 +2182,13 @@ class CspSubarray(with_metaclass(DeviceMeta,SKASubarray)):
        # PROTECTED REGION END #    //  CspSubarray.RemoveTimingBeams
    
    @AdminModeCheck('EndScan')
    @ObsStateCheck('endscan')
    def is_EndScan_allowed(self):
        return self._is_subarray_configuring_allowed()   
                  
    @command(
    )
    @DebugIt()
    @ObsStateCheck('endscan')
    def EndScan(self):
        # PROTECTED REGION ID(CspSubarray.EndScan) ENABLED START #
        """
@@ -2218,14 +2222,14 @@ class CspSubarray(with_metaclass(DeviceMeta,SKASubarray)):
        # PROTECTED REGION END #    //  CspSubarray.EndScan
        
    @AdminModeCheck('EndSB')
    @ObsStateCheck('endsb')
    def is_EndSB_allowed(self):
        return self._is_subarray_configuring_allowed()
    
    @command(
    )
    @DebugIt()
    #@SubarrayRejectCmd(['ConfigureScan'])
    @ObsStateCheck('endsb')
    @SubarrayRejectCmd(['ConfigureScan', 'Scan'])
    def EndSB(self):
        # PROTECTED REGION ID(CspSubarray.EndSB) ENABLED START #
        """
@@ -2266,6 +2270,7 @@ class CspSubarray(with_metaclass(DeviceMeta,SKASubarray)):
                                                           name="Thread-EndSB",
                                                           args=(self._sc_subarray_assigned_fqdn,))
        self._command_thread['endsb'].start()
        self._cmd_execution_state['endsb'] = CmdExecState.RUNNING
        # sleep for a while to let the thread start
        time.sleep(0.2)
        # TODO:
@@ -2273,14 +2278,29 @@ class CspSubarray(with_metaclass(DeviceMeta,SKASubarray)):
        # sub-array sub-component                
        # PROTECTED REGION END #    //  CspSubarray.EndSB
        
    @command(
    )
    @DebugIt()
    @ObsStateCheck('endsb')
    def GoToIdle(self):
        # PROTECTED REGION ID(CspSubarray.GoToIdle) ENABLED START #
        """
        Set the CspSubarray obsState to IDLE.

        :return:None
        """
        return self.EndSB()
        # PROTECTED REGION END #    //  CspSubarray.GoToIdle

        
    @AdminModeCheck('Abort')
    @ObsStateCheck('abort')
    def is_Abort_allowed(self):
        return self._is_subarray_configuring_allowed()
    
    @command(
    )
    @DebugIt()
    @ObsStateCheck('abort')
    def Abort(self):
        # PROTECTED REGION ID(CspSubarray.Abort) ENABLED START #
        """
+318 −0

File added.

Preview size limit exceeded, changes collapsed.

+69 −0
Original line number Diff line number Diff line
{
    "scanID": 1,
    "frequencyBand": "5a",
    "band5Tuning": [5.85, 7.25],
    "frequencyBandOffsetStream1": 0,
    "frequencyBandOffsetStream2": 0,
    "dopplerPhaseCorrSubscriptionPoint": "ska_mid/tm_leaf_node/csp_subarray_01/dopplerPhaseCorrection",
    "delayModelSubscriptionPoint": "ska_mid/tm_leaf_node/csp_subarray_01/delayModel",
    "visDestinationAddressSubscriptionPoint": "ska_mid/tm_leaf_node/csp_subarray_01/visDestinationAddress",
    "rfiFlaggingMask": {},
    "searchWindow": [
        {
            "searchWindowID": 1,
            "searchWindowTuning": 6000000000,
            "tdcEnable": true,
            "tdcNumBits": 8,
            "tdcPeriodBeforeEpoch": 5,
            "tdcPeriodAfterEpoch": 25,
            "tdcDestinationAddress": [
                {
                    "receptorID": 4,
                    "tdcDestinationAddress": ["foo", "bar", "8080"]
                },
                {
                    "receptorID": 1,
                    "tdcDestinationAddress": ["fizz", "buzz", "80"]
                }
            ]
        },
        {
            "searchWindowID": 2,
            "searchWindowTuning": 7000000000,
            "tdcEnable": false
        }
    ],
    "fsp": [
        {
            "fspID": 1,
            "functionMode": "CORR",
            "receptors": [4],
            "frequencySliceID": 1,
            "corrBandwidth": 1,
            "zoomWindowTuning": 4700000,
            "integrationTime": 140,
            "channelAveragingMap": [
                [1, 8],
                [745, 0],
                [1489, 0],
                [2233, 0],
                [2977, 0],
                [3721, 0],
                [4465, 0],
                [5209, 0],
                [5953, 0],
                [6697, 0],
                [7441, 0],
                [8185, 0],
                [8929, 0],
                [9673, 0],
                [10417, 0],
                [11161, 0],
                [11905, 0],
                [12649, 0],
                [13393, 0],
                [14137, 0]
            ]
        }
    ]
}