diff --git a/jupyter-notebooks/test_template.ipynb b/jupyter-notebooks/test_template.ipynb index 9d3553517b38f2a6ebdd1f54dc8cb5a461de4909..136e4965faa8023230e44ed5a6f602812e51e740 100644 --- a/jupyter-notebooks/test_template.ipynb +++ b/jupyter-notebooks/test_template.ipynb @@ -119,24 +119,11 @@ "id": "7532d05e", "metadata": {}, "source": [ - "### Hot reboot\n", + "### Reboot\n", "\n", "Makes sure the software and hardware are all in a known state." ] }, - { - "cell_type": "code", - "execution_count": 1, - "id": "c7a3effa", - "metadata": {}, - "outputs": [], - "source": [ - "# Restart boot device\n", - "boot.off()\n", - "boot.initialise()\n", - "boot.on()" - ] - }, { "cell_type": "code", "execution_count": 2, @@ -145,7 +132,7 @@ "outputs": [], "source": [ "# Reboot the station\n", - "boot.boot()" + "boot.reboot()" ] }, { diff --git a/tangostationcontrol/tangostationcontrol/devices/apsct.py b/tangostationcontrol/tangostationcontrol/devices/apsct.py index f75707676a19bbea21eef4352b3e53852cdc3968..20b161e97b16f99d352340246770d5db9f99f3e3 100644 --- a/tangostationcontrol/tangostationcontrol/devices/apsct.py +++ b/tangostationcontrol/tangostationcontrol/devices/apsct.py @@ -79,7 +79,30 @@ class APSCT(opcua_device): def read_APSCT_error_R(self): return ((self.proxy.APSCTTR_I2C_error_R > 0) - | self.alarm_val("APSCT_PCB_ID_R")) + | self.alarm_val("APSCT_PCB_ID_R") + | ~self.proxy.APSCT_INPUT_10MHz_good_R + | (~self.proxy.APSCT_INPUT_PPS_good_R & ~self.proxy.ASPCT_PPS_ignore_R) + | (~self.proxy.APSCT_PLL_160MHz_locked_R & ~self.proxy.APSCT_PLL_200MHz_locked_R) + | (self.proxy.APSCT_PLL_200MHz_locked_R & self.proxy.APSCT_PLL_200MHz_error_R) + | (self.proxy.APSCT_PLL_160MHz_locked_R & self.proxy.APSCT_PLL_160MHz_error_R) + ) + + APSCT_TEMP_error_R = attribute(dtype=bool) + APSCT_VOUT_error_R = attribute(dtype=bool) + + def read_APSCT_TEMP_error_R(self): + return (self.alarm_val("APSCT_TEMP_R")) + + def read_APSCT_VOUT_error_R(self): + return ( self.alarm_val("APSCT_PWR_PPSDIST_3V3_R") + | self.alarm_val("APSCT_PWR_CLKDIST1_3V3_R") + | self.alarm_val("APSCT_PWR_CLKDIST2_3V3_R") + | self.alarm_val("APSCT_PWR_CTRL_3V3_R") + | self.alarm_val("APSCT_PWR_INPUT_3V3_R") + | (self.proxy.APSCT_PWR_PLL_160MHz_on_R & self.alarm_val("APSCT_PWR_PLL_160MHz_3V3_R")) + | (self.proxy.APSCT_PWR_PLL_200MHz_on_R & self.alarm_val("APSCT_PWR_PLL_200MHz_3V3_R")) + | ~self.proxy.APSCT_PWR_on_R + ) # -------- # overloaded functions diff --git a/tangostationcontrol/tangostationcontrol/devices/apspu.py b/tangostationcontrol/tangostationcontrol/devices/apspu.py index 44b58c25ed3aca314fb93ae2f26f8cea90b663ee..d014a0eae151d89e77c71a9f0048dfb5e01bcd6b 100644 --- a/tangostationcontrol/tangostationcontrol/devices/apspu.py +++ b/tangostationcontrol/tangostationcontrol/devices/apspu.py @@ -72,6 +72,28 @@ class APSPU(opcua_device): | self.alarm_val("APSPU_FAN2_RPM_R") | self.alarm_val("APSPU_FAN3_RPM_R")) + APSPU_IOUT_error_R = attribute(dtype=bool) + APSPU_TEMP_error_R = attribute(dtype=bool) + APSPU_VOUT_error_R = attribute(dtype=bool) + + def read_APSPU_IOUT_error_R(self): + return ( self.alarm_val("APSPU_LBA_IOUT_R") + | self.alarm_val("APSPU_RCU2A_IOUT_R") + | self.alarm_val("APSPU_RCU2D_IOUT_R") + ) + + def read_APSPU_TEMP_error_R(self): + return ( self.alarm_val("APSPU_LBA_TEMP_R") + | self.alarm_val("APSPU_RCU2A_TEMP_R") + | self.alarm_val("APSPU_RCU2D_TEMP_R") + ) + + def read_APSPU_VOUT_error_R(self): + return ( self.alarm_val("APSPU_LBA_VOUT_R") + | self.alarm_val("APSPU_RCU2A_VOUT_R") + | self.alarm_val("APSPU_RCU2D_VOUT_R") + ) + # -------- # overloaded functions # -------- diff --git a/tangostationcontrol/tangostationcontrol/devices/lofar_device.py b/tangostationcontrol/tangostationcontrol/devices/lofar_device.py index 9d68a5decefe79e03211d6b587a3b299d88e954b..745fa641de5ba8af0352b1447e86973380968824 100644 --- a/tangostationcontrol/tangostationcontrol/devices/lofar_device.py +++ b/tangostationcontrol/tangostationcontrol/devices/lofar_device.py @@ -266,7 +266,7 @@ class lofar_device(Device, metaclass=DeviceMeta): # This is just the command version of _initialise_hardware(). self._initialise_hardware() - def _boot_device(self, initialise_hardware=True): + def _boot(self, initialise_hardware=True): # setup connections self.Initialise() diff --git a/tangostationcontrol/tangostationcontrol/devices/recv.py b/tangostationcontrol/tangostationcontrol/devices/recv.py index 965f276482bb50b370cd8be33ca0039de779f09e..238764ae29bd27e884b63a0de68e0640c0429065 100644 --- a/tangostationcontrol/tangostationcontrol/devices/recv.py +++ b/tangostationcontrol/tangostationcontrol/devices/recv.py @@ -186,6 +186,32 @@ class RECV(opcua_device): ~self.proxy.RCU_ADC_locked_R ) + RECV_IOUT_error_R = attribute(dtype=(bool,), max_dim_x=32) + RECV_TEMP_error_R = attribute(dtype=(bool,), max_dim_x=32) + RECV_VOUT_error_R = attribute(dtype=(bool,), max_dim_x=32) + + def read_RECV_IOUT_error_R(self): + return self.proxy.ANT_mask_RW & ( + self.alarm_val("RCU_PWR_ANT_IOUT_R") + ).any(axis=1) + + def read_RECV_TEMP_error_R(self): + return self.proxy.RCU_mask_RW & ( + self.alarm_val("RCU_TEMP_R") + ) + + def read_RECV_VOUT_error_R(self): + return (self.proxy.ANT_mask_RW & ( + self.alarm_val("RCU_PWR_ANT_VIN_R") + | self.alarm_val("RCU_PWR_ANT_VOUT_R") + ).any(axis=1) | (self.proxy.RCU_mask_RW & ( + self.alarm_val("RCU_PWR_1V8_R") + | self.alarm_val("RCU_PWR_2V5_R") + | self.alarm_val("RCU_PWR_3V3_R") + | ~self.proxy.RCU_PWR_DIGITAL_on_R + | ~self.proxy.RCU_PWR_good_R + ))) + # -------- # overloaded functions # -------- diff --git a/tangostationcontrol/tangostationcontrol/devices/sdp/sdp.py b/tangostationcontrol/tangostationcontrol/devices/sdp/sdp.py index 275d8fe8a44ad44e947ae573563cfd8f9454e304..2337b01429dfb9d03ddd27830d096cb53f3cc58e 100644 --- a/tangostationcontrol/tangostationcontrol/devices/sdp/sdp.py +++ b/tangostationcontrol/tangostationcontrol/devices/sdp/sdp.py @@ -214,6 +214,7 @@ class SDP(opcua_device): def read_FPGA_error_R(self): return self.proxy.TR_fpga_mask_RW & ( self.proxy.TR_fpga_communication_error_R + | self.alarm_val(self.proxy.FPGA_jesd204b_csr_dev_syncn_R).any(axis=1) ) def read_FPGA_processing_error_R(self): diff --git a/tangostationcontrol/tangostationcontrol/devices/sdp/sst.py b/tangostationcontrol/tangostationcontrol/devices/sdp/sst.py index 889f38ba2a6bbbd3bbcf43852c95edc1843d9317..f541f81080688fff53154c37ae049d18bf33aec1 100644 --- a/tangostationcontrol/tangostationcontrol/devices/sdp/sst.py +++ b/tangostationcontrol/tangostationcontrol/devices/sdp/sst.py @@ -104,6 +104,16 @@ class SST(Statistics): # whether the subband data was calibrated by the SDP (that is, were subband weights applied) subbands_calibrated_R = attribute_wrapper(comms_id=StatisticsClient, comms_annotation={"type": "statistics", "parameter": "subbands_calibrated"}, dims=(SSTCollector.MAX_INPUTS,), datatype=numpy.bool_) + # ---------- + # Summarising Attributes + # ---------- + FPGA_processing_error_R = attribute(dtype=(bool,), max_dim_x=16) + + def read_FPGA_processing_error_R(self): + return self.sdp_proxy.TR_fpga_mask_RW & ( + ~self.proxy.FPGA_sst_offload_enable_R + ) + # -------- # Overloaded functions # -------- diff --git a/tangostationcontrol/tangostationcontrol/devices/sdp/statistics.py b/tangostationcontrol/tangostationcontrol/devices/sdp/statistics.py index 21286acd44b5a83a8ac3fb904f55b2024bbf03fe..0e96366bcaa2758921ef4431a82e01ac653d19ad 100644 --- a/tangostationcontrol/tangostationcontrol/devices/sdp/statistics.py +++ b/tangostationcontrol/tangostationcontrol/devices/sdp/statistics.py @@ -13,6 +13,7 @@ # PyTango imports from tango.server import device_property +from tango import DeviceProxy # Additional import import asyncio @@ -123,6 +124,9 @@ class Statistics(opcua_device): future = asyncio.run_coroutine_threadsafe(self._connect_statistics(), self.statistics_client.event_loop) _ = future.result() + # proxy the SDP device in case we need the FPGA mask + self.sdp_proxy = DeviceProxy("STAT/SDP/1") + async def _connect_statistics(self): # map an access helper class for i in self.attr_list(): diff --git a/tangostationcontrol/tangostationcontrol/devices/sdp/xst.py b/tangostationcontrol/tangostationcontrol/devices/sdp/xst.py index 3b0f59d242c7d29ac707b7e7361d2e9dce706424..89da8dddcf19dc9195db6bc6c88c61475c61c2f6 100644 --- a/tangostationcontrol/tangostationcontrol/devices/sdp/xst.py +++ b/tangostationcontrol/tangostationcontrol/devices/sdp/xst.py @@ -144,6 +144,16 @@ class XST(Statistics): def read_xst_phase_R(self): return numpy.angle(self.statistics_client.collector.xst_values()) + # ---------- + # Summarising Attributes + # ---------- + FPGA_processing_error_R = attribute(dtype=(bool,), max_dim_x=16) + + def read_FPGA_processing_error_R(self): + return self.sdp_proxy.TR_fpga_mask_RW & ( + ~self.proxy.FPGA_xst_offload_enable_R + ) + # -------- # Overloaded functions # -------- diff --git a/tangostationcontrol/tangostationcontrol/devices/unb2.py b/tangostationcontrol/tangostationcontrol/devices/unb2.py index de7f736588b6c9cf303ff44b0a5fea9f8f9c9b30..d172c8ddc35a5111024929217d382477e385061c 100644 --- a/tangostationcontrol/tangostationcontrol/devices/unb2.py +++ b/tangostationcontrol/tangostationcontrol/devices/unb2.py @@ -123,24 +123,66 @@ class UNB2(opcua_device): # Summarising Attributes # ---------- UNB2_error_R = attribute(dtype=(bool,), max_dim_x=2) - UNB2_FPGA_error_R = attribute(dtype=((bool,),), max_dim_x=4, max_dim_y=2) - UNB2_QSFP_error_R = attribute(dtype=((bool,),), max_dim_x=24, max_dim_y=2) def read_UNB2_error_R(self): return self.proxy.UNB2_mask_RW & ( (self.proxy.UNB2TR_I2C_bus_error_R > 0) | self.alarm_val("UNB2_PCB_ID_R") + | (self.proxy.UNB2TR_I2C_bus_DDR4_error_R > 0).any(axis=1) + | (self.proxy.UNB2TR_I2C_bus_FPGA_PS_error_R > 0).any(axis=1) + | (self.proxy.UNB2TR_I2C_bus_QSFP_error_R > 0).any(axis=1) ) - def read_UNB2_FPGA_error_R(self): + UNB2_IOUT_error_R = attribute(dtype=(bool,), max_dim_x=2) + UNB2_TEMP_error_R = attribute(dtype=(bool,), max_dim_x=2) + UNB2_VOUT_error_R = attribute(dtype=(bool,), max_dim_x=2) + + def read_UNB2_IOUT_error_R(self): + return self.proxy.UNB2_mask_RW & ( + self.alarm_val("UNB2_DC_DC_48V_12V_IOUT_R") + | self.alarm_val("UNB2_FPGA_POL_CORE_IOUT_R").any(axis=1) + | self.alarm_val("UNB2_FPGA_POL_ERAM_IOUT_R").any(axis=1) + | self.alarm_val("UNB2_FPGA_POL_HGXB_IOUT_R").any(axis=1) + | self.alarm_val("UNB2_FPGA_POL_PGM_IOUT_R").any(axis=1) + | self.alarm_val("UNB2_FPGA_POL_RXGXB_IOUT_R").any(axis=1) + | self.alarm_val("UNB2_FPGA_POL_TXGXB_IOUT_R").any(axis=1) + | self.alarm_val("UNB2_POL_CLOCK_IOUT_R") + | self.alarm_val("UNB2_POL_QSFP_N01_IOUT_R") + | self.alarm_val("UNB2_POL_QSFP_N23_IOUT_R") + | self.alarm_val("UNB2_POL_SWITCH_1V2_IOUT_R") + | self.alarm_val("UNB2_POL_SWITCH_PHY_IOUT_R") + ) + + def read_UNB2_TEMP_error_R(self): return self.proxy.UNB2_mask_RW & ( - (self.proxy.UNB2TR_I2C_bus_DDR4_error_R > 0) - | (self.proxy.UNB2TR_I2C_bus_FPGA_PS_error_R > 0) + self.alarm_val("UNB2_DC_DC_48V_12V_TEMP_R") + | self.alarm_val("UNB2_FPGA_POL_CORE_TEMP_R").any(axis=1) + | self.alarm_val("UNB2_FPGA_POL_ERAM_TEMP_R").any(axis=1) + | self.alarm_val("UNB2_FPGA_POL_HGXB_TEMP_R").any(axis=1) + | self.alarm_val("UNB2_FPGA_POL_PGM_TEMP_R").any(axis=1) + | self.alarm_val("UNB2_FPGA_POL_RXGXB_TEMP_R").any(axis=1) + | self.alarm_val("UNB2_FPGA_POL_TXGXB_TEMP_R").any(axis=1) + | self.alarm_val("UNB2_POL_CLOCK_TEMP_R") + | self.alarm_val("UNB2_POL_QSFP_N01_TEMP_R") + | self.alarm_val("UNB2_POL_QSFP_N23_TEMP_R") + | self.alarm_val("UNB2_POL_SWITCH_1V2_TEMP_R") + | self.alarm_val("UNB2_POL_SWITCH_PHY_TEMP_R") ) - def read_UNB2_QSFP_error_R(self): + def read_UNB2_VOUT_error_R(self): return self.proxy.UNB2_mask_RW & ( - (self.proxy.UNB2TR_I2C_bus_QSFP_error_R > 0) + self.alarm_val("UNB2_DC_DC_48V_12V_VOUT_R") + | self.alarm_val("UNB2_FPGA_POL_CORE_VOUT_R").any(axis=1) + | self.alarm_val("UNB2_FPGA_POL_ERAM_VOUT_R").any(axis=1) + | self.alarm_val("UNB2_FPGA_POL_HGXB_VOUT_R").any(axis=1) + | self.alarm_val("UNB2_FPGA_POL_PGM_VOUT_R").any(axis=1) + | self.alarm_val("UNB2_FPGA_POL_RXGXB_VOUT_R").any(axis=1) + | self.alarm_val("UNB2_FPGA_POL_TXGXB_VOUT_R").any(axis=1) + | self.alarm_val("UNB2_POL_CLOCK_VOUT_R") + | self.alarm_val("UNB2_POL_QSFP_N01_VOUT_R") + | self.alarm_val("UNB2_POL_QSFP_N23_VOUT_R") + | self.alarm_val("UNB2_POL_SWITCH_1V2_VOUT_R") + | self.alarm_val("UNB2_POL_SWITCH_PHY_VOUT_R") ) # --------