From 480c80f0b080901a64ca904facd74ce4a8f9f46a Mon Sep 17 00:00:00 2001
From: stedif <stefano.difrischia@inaf.it>
Date: Mon, 31 Jan 2022 16:20:27 +0100
Subject: [PATCH] L2SS-578: convert hbat_bf_delay_step_delays into a Tango
 attribute

---
 .../tangostationcontrol/devices/beam.py       |  2 +-
 .../tangostationcontrol/devices/recv.py       | 44 +++++++++++++------
 .../devices/test_device_beam.py               | 12 +++++
 3 files changed, 44 insertions(+), 14 deletions(-)

diff --git a/tangostationcontrol/tangostationcontrol/devices/beam.py b/tangostationcontrol/tangostationcontrol/devices/beam.py
index d674aafa9..2c70cec0a 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.get_property('HBAT_bf_delay_step_delays')['HBAT_bf_delay_step_delays'][0]
+        HBAT_bf_delay_step_delays = self.recv_proxy.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 636b694a0..64bcfcc82 100644
--- a/tangostationcontrol/tangostationcontrol/devices/recv.py
+++ b/tangostationcontrol/tangostationcontrol/devices/recv.py
@@ -32,6 +32,18 @@ __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
     # -----------------
@@ -48,19 +60,20 @@ class RECV(opcua_device):
         default_value=[True] * 32
     )
 
-    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)
-    )
+    # 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)
+    # )
 
     first_default_settings = [
         # set the masks first, as those filter any subsequent settings
@@ -76,6 +89,11 @@ class RECV(opcua_device):
 
     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).
     HBAT_BF_delays_R             = attribute_wrapper(comms_annotation=["HBAT_BF_delays_R"          ],datatype=numpy.int64  , dims=(32,96))
diff --git a/tangostationcontrol/tangostationcontrol/integration_test/devices/test_device_beam.py b/tangostationcontrol/tangostationcontrol/integration_test/devices/test_device_beam.py
index 8e1f2091f..edae4375c 100644
--- a/tangostationcontrol/tangostationcontrol/integration_test/devices/test_device_beam.py
+++ b/tangostationcontrol/tangostationcontrol/integration_test/devices/test_device_beam.py
@@ -27,8 +27,11 @@ class TestDeviceBeam(AbstractTestBases.TestDeviceBase):
         recv_proxy = TestDeviceProxy("STAT/RECV/1")
         recv_proxy.off()
         recv_proxy.initialise()
+        recv_proxy.set_defaults()
         recv_proxy.on()
 
+        self.proxy.recv_proxy = recv_proxy
+
         # Verify attribute is present (all zeros if never used before)
         HBAT_delays_r1 = numpy.array(recv_proxy.read_attribute('HBAT_BF_delays_RW').value)
         self.assertIsNotNone(HBAT_delays_r1)
@@ -37,6 +40,15 @@ class TestDeviceBeam(AbstractTestBases.TestDeviceBase):
         self.proxy.HBAT_set_pointing(numpy.array([["J2000","0deg","0deg"]] * 96).flatten())  # write values to RECV
         HBAT_delays_r2 = numpy.array(recv_proxy.read_attribute('HBAT_BF_delays_RW').value)
         self.assertIsNotNone(HBAT_delays_r2)
+
+        # 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)
+        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)
         
         # Verify delays changed (to be discussed)
         #self.assertFalse((HBAT_delays_r1==HBAT_delays_r2).all())
-- 
GitLab