From a0e32e3f8ac5af181d38173aa72151943c51370c Mon Sep 17 00:00:00 2001
From: stedif <stefano.difrischia@inaf.it>
Date: Tue, 1 Feb 2022 13:13:30 +0100
Subject: [PATCH] L2SS-578: expose recv property so it can be retrieved from
 beam

---
 .../tangostationcontrol/devices/beam.py       |  2 +-
 .../tangostationcontrol/devices/recv.py       | 52 ++++++++-----------
 .../devices/test_device_beam.py               | 16 +++---
 3 files changed, 28 insertions(+), 42 deletions(-)

diff --git a/tangostationcontrol/tangostationcontrol/devices/beam.py b/tangostationcontrol/tangostationcontrol/devices/beam.py
index cd08d50e5..62580130a 100644
--- a/tangostationcontrol/tangostationcontrol/devices/beam.py
+++ b/tangostationcontrol/tangostationcontrol/devices/beam.py
@@ -135,7 +135,7 @@ class Beam(lofar_device):
         delays = self._HBAT_delays(pointing_direction, timestamp)
         
         # Convert delays into beam weights
-        HBAT_bf_delay_step_delays = self.recv_proxy.HBAT_bf_delay_step_delays
+        HBAT_bf_delay_step_delays = self.recv_proxy.get_hbat_bf_delay_step_delays()
         HBAT_bf_delays = self._calculate_HBAT_bf_delays(delays, self.HBAT_signal_input_delays, HBAT_bf_delay_step_delays)
 
         # Write weights to RECV
diff --git a/tangostationcontrol/tangostationcontrol/devices/recv.py b/tangostationcontrol/tangostationcontrol/devices/recv.py
index 64bcfcc82..5eb036264 100644
--- a/tangostationcontrol/tangostationcontrol/devices/recv.py
+++ b/tangostationcontrol/tangostationcontrol/devices/recv.py
@@ -15,7 +15,7 @@
 from tango import DebugIt
 from tango.server import command
 from tango.server import device_property, attribute
-from tango import AttrWriteType, DevState
+from tango import AttrWriteType, DevState, DevVarFloatArray
 import numpy
 
 # Additional import
@@ -33,17 +33,6 @@ __all__ = ["RECV", "main"]
 @device_logging_to_python()
 class RECV(opcua_device):
     
-    # TODO: to be deleted in L2SS-574
-    _hbat_bf_delay_step_delays = numpy.array([
-            0.0,        0.5228E-9,  0.9797E-9,  1.4277E-9,  1.9055E-9,
-            2.4616E-9,  2.9539E-9,  3.4016E-9,  3.8076E-9,  4.3461E-9,
-            4.9876E-9,  5.4894E-9,  5.7973E-9,  6.2707E-9,  6.8628E-9,
-            7.3989E-9,  8.0673E-9,  8.6188E-9,  9.1039E-9,  9.5686E-9,
-            10.0463E-9, 10.5774E-9, 11.0509E-9, 11.5289E-9, 11.9374E-9,
-            12.4524E-9, 13.0842E-9, 13.5936E-9, 13.9198E-9, 14.4087E-9,
-            14.9781E-9, 15.5063E-9
-        ],dtype=numpy.float64)
-
     # -----------------
     # Device Properties
     # -----------------
@@ -60,20 +49,19 @@ class RECV(opcua_device):
         default_value=[True] * 32
     )
 
-    # TODO: to be restored in L2SS-574
-    # HBAT_bf_delay_step_delays = device_property(
-    #     dtype="DevVarFloatArray",
-    #     mandatory=False,
-    #     default_value=numpy.array([
-    #         0.0,        0.5228E-9,  0.9797E-9,  1.4277E-9,  1.9055E-9,
-    #         2.4616E-9,  2.9539E-9,  3.4016E-9,  3.8076E-9,  4.3461E-9,
-    #         4.9876E-9,  5.4894E-9,  5.7973E-9,  6.2707E-9,  6.8628E-9,
-    #         7.3989E-9,  8.0673E-9,  8.6188E-9,  9.1039E-9,  9.5686E-9,
-    #         10.0463E-9, 10.5774E-9, 11.0509E-9, 11.5289E-9, 11.9374E-9,
-    #         12.4524E-9, 13.0842E-9, 13.5936E-9, 13.9198E-9, 14.4087E-9,
-    #         14.9781E-9, 15.5063E-9
-    #     ],dtype=numpy.float64)
-    # )
+    HBAT_bf_delay_step_delays = device_property(
+        dtype="DevVarFloatArray",
+        mandatory=False,
+        default_value=numpy.array([
+            0.0,        0.5228E-9,  0.9797E-9,  1.4277E-9,  1.9055E-9,
+            2.4616E-9,  2.9539E-9,  3.4016E-9,  3.8076E-9,  4.3461E-9,
+            4.9876E-9,  5.4894E-9,  5.7973E-9,  6.2707E-9,  6.8628E-9,
+            7.3989E-9,  8.0673E-9,  8.6188E-9,  9.1039E-9,  9.5686E-9,
+            10.0463E-9, 10.5774E-9, 11.0509E-9, 11.5289E-9, 11.9374E-9,
+            12.4524E-9, 13.0842E-9, 13.5936E-9, 13.9198E-9, 14.4087E-9,
+            14.9781E-9, 15.5063E-9
+        ],dtype=numpy.float64)
+    )
 
     first_default_settings = [
         # set the masks first, as those filter any subsequent settings
@@ -88,11 +76,6 @@ class RECV(opcua_device):
     RCU_LED_colour_R = attribute(dtype=(numpy.uint32,), max_dim_x=32, fget=lambda self: (2 * self.proxy.RCU_LED_green_on_R + 4 * self.proxy.RCU_LED_red_on_R).astype(numpy.uint32))
 
     ANT_mask_RW                  = attribute_wrapper(comms_annotation=["ANT_mask_RW"               ],datatype=numpy.bool_  , dims=(3,32), access=AttrWriteType.READ_WRITE)
-
-    # TODO: convert back to property in L2SS-574
-    HBAT_bf_delay_step_delays = attribute(access=AttrWriteType.READ,
-        dtype=(numpy.float64,), max_dim_x=32,
-        fget=lambda self: self._hbat_bf_delay_step_delays)
     
     # The HBAT beamformer delays represent 32 delays for each of the 96 inputs.
     # The 32 delays deconstruct as delays[polarisation][dipole], and each delay is the number of 'delay steps' to apply (0.5ns for HBAT1).
@@ -143,6 +126,13 @@ class RECV(opcua_device):
     # --------
     # Commands
     # --------
+    @command(dtype_out=DevVarFloatArray)
+    @DebugIt()
+    @only_in_states([DevState.ON])
+    def get_hbat_bf_delay_step_delays(self):
+        """ Return the property HBAT_bf_delay_step_delays """
+        return self.HBAT_bf_delay_step_delays
+
     @command()
     @DebugIt()
     @only_in_states([DevState.STANDBY, DevState.ON])
diff --git a/tangostationcontrol/tangostationcontrol/integration_test/devices/test_device_beam.py b/tangostationcontrol/tangostationcontrol/integration_test/devices/test_device_beam.py
index c83e0af39..71e419318 100644
--- a/tangostationcontrol/tangostationcontrol/integration_test/devices/test_device_beam.py
+++ b/tangostationcontrol/tangostationcontrol/integration_test/devices/test_device_beam.py
@@ -36,17 +36,13 @@ class TestDeviceBeam(AbstractTestBases.TestDeviceBase):
         HBAT_delays_r1 = numpy.array(recv_proxy.read_attribute('HBAT_BF_delays_RW').value)
         self.assertIsNotNone(HBAT_delays_r1)
 
-        # Unable to independently test '_calculate_HBAT_bf_delays' because it is not a Tango command, 
-        # thus DeviceProxy cannot access it. On the other hand, the method cannot be unit-tested because it
-        # requires access to a DeviceRecv property from DeviceBeam. This last requirement should change with L2SS-574
-        # 
         # verify if values are actually transformed
-        # HBAT_delays_flat = self.proxy.HBAT_delays(numpy.array([["J2000","0deg","0deg"]] * 96).flatten()) 
-        # HBAT_delays = numpy.array(HBAT_delays_flat).reshape(96,16)
-        # HBAT_signal_input_delays = numpy.zeros((96,32), dtype=numpy.float64)    # Property of Beam-device
-        # HBAT_bf_delay_step_delays = recv_proxy.HBAT_bf_delay_step_delays
-        # HBAT_bf_delays = self.proxy._calculate_HBAT_bf_delays(HBAT_delays, HBAT_signal_input_delays, HBAT_bf_delay_step_delays)
-        # self.assertNotEqual(HBAT_delays, HBAT_bf_delays)
+        HBAT_delays_flat = self.proxy.HBAT_delays(numpy.array([["J2000","0deg","0deg"]] * 96).flatten()) 
+        HBAT_delays = numpy.array(HBAT_delays_flat).reshape(96,16)
+        HBAT_signal_input_delays = numpy.zeros((96,32), dtype=numpy.float64)    # Property of Beam-device
+        HBAT_bf_delay_step_delays = recv_proxy.get_hbat_bf_delay_step_delays()
+        HBAT_bf_delays = self.proxy._calculate_HBAT_bf_delays(HBAT_delays, HBAT_signal_input_delays, HBAT_bf_delay_step_delays)
+        self.assertNotEqual(HBAT_delays, HBAT_bf_delays)
         
         # Verify writing operation does not lead to errors
         self.proxy.HBAT_set_pointing(numpy.array([["J2000","0deg","0deg"]] * 96).flatten())  # write values to RECV
-- 
GitLab