"""Provides methods to configure the SlotPower measurement."""
import functools
import nirfmxtdscdma.attributes as attributes
import nirfmxtdscdma.enums as enums
import nirfmxtdscdma.errors as errors
import nirfmxtdscdma.internal._helper as _helper
def _raise_if_disposed(f):
"""From https://stackoverflow.com/questions/5929107/decorators-with-parameters."""
@functools.wraps(f)
def aux(*xs, **kws):
meas_obj = xs[0] # parameter 0 is 'self' which is the measurement object
if meas_obj._signal_obj.is_disposed:
raise Exception("Cannot access a disposed Tdscdma signal configuration")
return f(*xs, **kws)
return aux
[docs]
class SlotPowerConfiguration(object):
"""Provides methods to configure the SlotPower measurement."""
def __init__(self, signal_obj):
"""Provides methods to configure the SlotPower measurement."""
self._signal_obj = signal_obj
self._session_function_lock = signal_obj._session_function_lock
self._interpreter = signal_obj._interpreter
[docs]
@_raise_if_disposed
def get_measurement_enabled(self, selector_string):
r"""Gets whether to enable the SlotPower measurement.
You do not need to use a selector string to configure or read this attribute for the default signal instance.
Refer to the `Selector String <https://www.ni.com/docs/en-US/bundle/rfmx/page/selector-strings-net.html>`_ topic for
information about the string syntax for named signals.
The default value is FALSE.
Args:
selector_string (string):
Pass an empty string.
Returns:
Tuple (attr_val, error_code):
attr_val (bool):
Specifies whether to enable the SlotPower measurement.
error_code (int):
Returns the status code of this method. The status code either indicates success or describes a warning condition.
"""
try:
self._session_function_lock.enter_read_lock()
updated_selector_string = _helper.validate_and_update_selector_string(
selector_string, self._signal_obj
)
attr_val, error_code = self._interpreter.get_attribute_i32(
updated_selector_string, attributes.AttributeID.SLOTPOWER_MEASUREMENT_ENABLED.value
)
attr_val = bool(attr_val)
finally:
self._session_function_lock.exit_read_lock()
return attr_val, error_code
[docs]
@_raise_if_disposed
def set_measurement_enabled(self, selector_string, value):
r"""Sets whether to enable the SlotPower measurement.
You do not need to use a selector string to configure or read this attribute for the default signal instance.
Refer to the `Selector String <https://www.ni.com/docs/en-US/bundle/rfmx/page/selector-strings-net.html>`_ topic for
information about the string syntax for named signals.
The default value is FALSE.
Args:
selector_string (string):
Pass an empty string.
value (bool):
Specifies whether to enable the SlotPower measurement.
Returns:
int:
Returns the status code of this method. The status code either indicates success or describes a warning condition.
"""
try:
self._session_function_lock.enter_read_lock()
updated_selector_string = _helper.validate_and_update_selector_string(
selector_string, self._signal_obj
)
error_code = self._interpreter.set_attribute_i32(
updated_selector_string,
attributes.AttributeID.SLOTPOWER_MEASUREMENT_ENABLED.value,
int(value),
)
finally:
self._session_function_lock.exit_read_lock()
return error_code
[docs]
@_raise_if_disposed
def get_measurement_length(self, selector_string):
r"""Gets the measurement length for the SlotPower measurement. This value is expressed in slots. The SlotPower
measurement assumes that there is only one active traffic time slot per subframe, and that the position of this active
time slot is the same in each subframe. Additionally, it assumes that there are no pilots present in the received
signal.
NI recommends you set a measurement length as a multiple of the number of slots per subframe, that is a
multiple of 7. For example, when you set this attribute to 28 slots, the SlotPower measurement would report results for
the 4 active time slots within the specified measurement length. In this example, 28 slots = 4 subframes.
The start of the measurement is determined by the :py:attr:`~nirfmxtdscdma.attributes.AttributeID.TRIGGER_TYPE`
attribute. Although all the values of the Trigger Type attribute are supported for this measurement, it is recommended
to set the Trigger Type attribute to **Digital Edge** with the following options:
- Digital trigger at the start of active slot, with the :py:attr:`~nirfmxtdscdma.attributes.AttributeID.TRIGGER_DELAY` attribute set to 0 seconds
- Digital trigger at the start of the subframe, with the Trigger Delay attribute configured to a value which is equal to the time offset of the active time slot from the start of the subframe
The table shows the values of the Trigger Delay attribute, when you specify the following active slots values:
+-------------+------------------------------+
| Active Slot | Trigger Delay (microseconds) |
+=============+==============================+
| TS0 | 0 |
+-------------+------------------------------+
| TS1 | 950 |
+-------------+------------------------------+
| TS2 | 1625 |
+-------------+------------------------------+
| TS3 | 2300 |
+-------------+------------------------------+
| TS4 | 2975 |
+-------------+------------------------------+
| TS5 | 3650 |
+-------------+------------------------------+
| TS6 | 4325 |
+-------------+------------------------------+
If you cannot provide a digital trigger, you can set Trigger Type attribute to **IQ Power Edge** to ensure that
the measurement starts at the start of an active time slot. To ensure this trigger works properly, NI recommends you
complete the following steps:
- Set the :py:attr:`~nirfmxtdscdma.attributes.AttributeID.IQ_POWER_EDGE_TRIGGER_LEVEL` attribute to allow triggering for any of the power levels in the active slots
- Run the RFmx measurement just before generating your signal
If you set the Trigger type attribute to **None**, the measurement will automatically detect the start of the
first burst and measure the traffic slot in that position in every subframe.
You do not need to use a selector string to configure or read this attribute for the default signal instance.
Refer to the `Selector String <https://www.ni.com/docs/en-US/bundle/rfmx/page/selector-strings-net.html>`_ topic for
information about the string syntax for named signals.
The default value is 28. The minimum value is 1.
Args:
selector_string (string):
Pass an empty string.
Returns:
Tuple (attr_val, error_code):
attr_val (int):
Specifies the measurement length for the SlotPower measurement. This value is expressed in slots. The SlotPower
measurement assumes that there is only one active traffic time slot per subframe, and that the position of this active
time slot is the same in each subframe. Additionally, it assumes that there are no pilots present in the received
signal.
error_code (int):
Returns the status code of this method. The status code either indicates success or describes a warning condition.
"""
try:
self._session_function_lock.enter_read_lock()
updated_selector_string = _helper.validate_and_update_selector_string(
selector_string, self._signal_obj
)
attr_val, error_code = self._interpreter.get_attribute_i32(
updated_selector_string, attributes.AttributeID.SLOTPOWER_MEASUREMENT_LENGTH.value
)
finally:
self._session_function_lock.exit_read_lock()
return attr_val, error_code
[docs]
@_raise_if_disposed
def set_measurement_length(self, selector_string, value):
r"""Sets the measurement length for the SlotPower measurement. This value is expressed in slots. The SlotPower
measurement assumes that there is only one active traffic time slot per subframe, and that the position of this active
time slot is the same in each subframe. Additionally, it assumes that there are no pilots present in the received
signal.
NI recommends you set a measurement length as a multiple of the number of slots per subframe, that is a
multiple of 7. For example, when you set this attribute to 28 slots, the SlotPower measurement would report results for
the 4 active time slots within the specified measurement length. In this example, 28 slots = 4 subframes.
The start of the measurement is determined by the :py:attr:`~nirfmxtdscdma.attributes.AttributeID.TRIGGER_TYPE`
attribute. Although all the values of the Trigger Type attribute are supported for this measurement, it is recommended
to set the Trigger Type attribute to **Digital Edge** with the following options:
- Digital trigger at the start of active slot, with the :py:attr:`~nirfmxtdscdma.attributes.AttributeID.TRIGGER_DELAY` attribute set to 0 seconds
- Digital trigger at the start of the subframe, with the Trigger Delay attribute configured to a value which is equal to the time offset of the active time slot from the start of the subframe
The table shows the values of the Trigger Delay attribute, when you specify the following active slots values:
+-------------+------------------------------+
| Active Slot | Trigger Delay (microseconds) |
+=============+==============================+
| TS0 | 0 |
+-------------+------------------------------+
| TS1 | 950 |
+-------------+------------------------------+
| TS2 | 1625 |
+-------------+------------------------------+
| TS3 | 2300 |
+-------------+------------------------------+
| TS4 | 2975 |
+-------------+------------------------------+
| TS5 | 3650 |
+-------------+------------------------------+
| TS6 | 4325 |
+-------------+------------------------------+
If you cannot provide a digital trigger, you can set Trigger Type attribute to **IQ Power Edge** to ensure that
the measurement starts at the start of an active time slot. To ensure this trigger works properly, NI recommends you
complete the following steps:
- Set the :py:attr:`~nirfmxtdscdma.attributes.AttributeID.IQ_POWER_EDGE_TRIGGER_LEVEL` attribute to allow triggering for any of the power levels in the active slots
- Run the RFmx measurement just before generating your signal
If you set the Trigger type attribute to **None**, the measurement will automatically detect the start of the
first burst and measure the traffic slot in that position in every subframe.
You do not need to use a selector string to configure or read this attribute for the default signal instance.
Refer to the `Selector String <https://www.ni.com/docs/en-US/bundle/rfmx/page/selector-strings-net.html>`_ topic for
information about the string syntax for named signals.
The default value is 28. The minimum value is 1.
Args:
selector_string (string):
Pass an empty string.
value (int):
Specifies the measurement length for the SlotPower measurement. This value is expressed in slots. The SlotPower
measurement assumes that there is only one active traffic time slot per subframe, and that the position of this active
time slot is the same in each subframe. Additionally, it assumes that there are no pilots present in the received
signal.
Returns:
int:
Returns the status code of this method. The status code either indicates success or describes a warning condition.
"""
try:
self._session_function_lock.enter_read_lock()
updated_selector_string = _helper.validate_and_update_selector_string(
selector_string, self._signal_obj
)
error_code = self._interpreter.set_attribute_i32(
updated_selector_string,
attributes.AttributeID.SLOTPOWER_MEASUREMENT_LENGTH.value,
value,
)
finally:
self._session_function_lock.exit_read_lock()
return error_code
[docs]
@_raise_if_disposed
def get_spectrum_inverted(self, selector_string):
r"""Gets whether the spectrum of the signal is inverted.
You do not need to use a selector string to configure or read this attribute for the default signal instance.
Refer to the `Selector String <https://www.ni.com/docs/en-US/bundle/rfmx/page/selector-strings-net.html>`_ topic for
information about the string syntax for named signals.
The default value is **False**.
+--------------+-------------------------------+
| Name (Value) | Description |
+==============+===============================+
| False (0) | The spectrum is not inverted. |
+--------------+-------------------------------+
| True (1) | The spectrum is inverted. |
+--------------+-------------------------------+
Args:
selector_string (string):
Pass an empty string.
Returns:
Tuple (attr_val, error_code):
attr_val (enums.SlotPowerSpectrumInverted):
Specifies whether the spectrum of the signal is inverted.
error_code (int):
Returns the status code of this method. The status code either indicates success or describes a warning condition.
"""
try:
self._session_function_lock.enter_read_lock()
updated_selector_string = _helper.validate_and_update_selector_string(
selector_string, self._signal_obj
)
attr_val, error_code = self._interpreter.get_attribute_i32(
updated_selector_string, attributes.AttributeID.SLOTPOWER_SPECTRUM_INVERTED.value
)
attr_val = enums.SlotPowerSpectrumInverted(attr_val)
except (KeyError, ValueError):
raise errors.DriverTooNewError() # type: ignore
finally:
self._session_function_lock.exit_read_lock()
return attr_val, error_code
[docs]
@_raise_if_disposed
def set_spectrum_inverted(self, selector_string, value):
r"""Sets whether the spectrum of the signal is inverted.
You do not need to use a selector string to configure or read this attribute for the default signal instance.
Refer to the `Selector String <https://www.ni.com/docs/en-US/bundle/rfmx/page/selector-strings-net.html>`_ topic for
information about the string syntax for named signals.
The default value is **False**.
+--------------+-------------------------------+
| Name (Value) | Description |
+==============+===============================+
| False (0) | The spectrum is not inverted. |
+--------------+-------------------------------+
| True (1) | The spectrum is inverted. |
+--------------+-------------------------------+
Args:
selector_string (string):
Pass an empty string.
value (enums.SlotPowerSpectrumInverted, int):
Specifies whether the spectrum of the signal is inverted.
Returns:
int:
Returns the status code of this method. The status code either indicates success or describes a warning condition.
"""
try:
self._session_function_lock.enter_read_lock()
updated_selector_string = _helper.validate_and_update_selector_string(
selector_string, self._signal_obj
)
value = value.value if type(value) is enums.SlotPowerSpectrumInverted else value
error_code = self._interpreter.set_attribute_i32(
updated_selector_string,
attributes.AttributeID.SLOTPOWER_SPECTRUM_INVERTED.value,
value,
)
finally:
self._session_function_lock.exit_read_lock()
return error_code
[docs]
@_raise_if_disposed
def get_rrc_filter_enabled(self, selector_string):
r"""Gets whether the RRC filter should be enabled or not.
You do not need to use a selector string to configure or read this attribute for the default signal instance.
Refer to the `Selector String <https://www.ni.com/docs/en-US/bundle/rfmx/page/selector-strings-net.html>`_ topic for
information about the string syntax for named signals.
The default value is **True**.
+--------------+-------------------------------------------------------+
| Name (Value) | Description |
+==============+=======================================================+
| False (0) | Disables the RRC filter in the SlotPower measurement. |
+--------------+-------------------------------------------------------+
| True (1) | Enables the RRC filter in the SlotPower measurement. |
+--------------+-------------------------------------------------------+
Args:
selector_string (string):
Pass an empty string.
Returns:
Tuple (attr_val, error_code):
attr_val (enums.SlotPowerRrcFilterEnabled):
Specifies whether the RRC filter should be enabled or not.
error_code (int):
Returns the status code of this method. The status code either indicates success or describes a warning condition.
"""
try:
self._session_function_lock.enter_read_lock()
updated_selector_string = _helper.validate_and_update_selector_string(
selector_string, self._signal_obj
)
attr_val, error_code = self._interpreter.get_attribute_i32(
updated_selector_string, attributes.AttributeID.SLOTPOWER_RRC_FILTER_ENABLED.value
)
attr_val = enums.SlotPowerRrcFilterEnabled(attr_val)
except (KeyError, ValueError):
raise errors.DriverTooNewError() # type: ignore
finally:
self._session_function_lock.exit_read_lock()
return attr_val, error_code
[docs]
@_raise_if_disposed
def set_rrc_filter_enabled(self, selector_string, value):
r"""Sets whether the RRC filter should be enabled or not.
You do not need to use a selector string to configure or read this attribute for the default signal instance.
Refer to the `Selector String <https://www.ni.com/docs/en-US/bundle/rfmx/page/selector-strings-net.html>`_ topic for
information about the string syntax for named signals.
The default value is **True**.
+--------------+-------------------------------------------------------+
| Name (Value) | Description |
+==============+=======================================================+
| False (0) | Disables the RRC filter in the SlotPower measurement. |
+--------------+-------------------------------------------------------+
| True (1) | Enables the RRC filter in the SlotPower measurement. |
+--------------+-------------------------------------------------------+
Args:
selector_string (string):
Pass an empty string.
value (enums.SlotPowerRrcFilterEnabled, int):
Specifies whether the RRC filter should be enabled or not.
Returns:
int:
Returns the status code of this method. The status code either indicates success or describes a warning condition.
"""
try:
self._session_function_lock.enter_read_lock()
updated_selector_string = _helper.validate_and_update_selector_string(
selector_string, self._signal_obj
)
value = value.value if type(value) is enums.SlotPowerRrcFilterEnabled else value
error_code = self._interpreter.set_attribute_i32(
updated_selector_string,
attributes.AttributeID.SLOTPOWER_RRC_FILTER_ENABLED.value,
value,
)
finally:
self._session_function_lock.exit_read_lock()
return error_code