"""Provides methods to fetch and read the SlotPhase measurement results."""
import functools
import nirfmxwcdma.attributes as attributes
import nirfmxwcdma.errors as errors
import nirfmxwcdma.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 Wcdma signal configuration")
return f(*xs, **kws)
return aux
[docs]
class SlotPhaseResults(object):
"""Provides methods to fetch and read the SlotPhase measurement results."""
def __init__(self, signal_obj):
"""Provides methods to fetch and read the SlotPhase measurement results."""
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_maximum_phase_discontinuity(self, selector_string):
r"""Gets the maximum of all the measured phase discontinuity values at the slot boundaries.
You do not need to use a selector string to read this result for default signal and result 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 and results.
This value is expressed in degrees.
Args:
selector_string (string):
Pass an empty string.
Returns:
Tuple (attr_val, error_code):
attr_val (float):
Returns the maximum of all the measured phase discontinuity values at the slot boundaries.
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_f64(
updated_selector_string,
attributes.AttributeID.SLOTPHASE_RESULTS_MAXIMUM_PHASE_DISCONTINUITY.value,
)
finally:
self._session_function_lock.exit_read_lock()
return attr_val, error_code
[docs]
@_raise_if_disposed
def get_discontinuity_count_greater_than_limit1(self, selector_string):
r"""Gets the number of times the phase discontinuity values exceed the *Limit 1* value for the acquired signal. *Limit
1* is fixed at 36 degrees.
You do not need to use a selector string to read this result for default signal and result 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 and results.
Args:
selector_string (string):
Pass an empty string.
Returns:
Tuple (attr_val, error_code):
attr_val (int):
Returns the number of times the phase discontinuity values exceed the *Limit 1* value for the acquired signal. *Limit
1* is fixed at 36 degrees.
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.SLOTPHASE_RESULTS_DISCONTINUITY_COUNT_GREATER_THAN_LIMIT1.value,
)
finally:
self._session_function_lock.exit_read_lock()
return attr_val, error_code
[docs]
@_raise_if_disposed
def get_discontinuity_count_greater_than_limit2(self, selector_string):
r"""Gets the number of times the phase discontinuity values exceed the *Limit 2* value for the acquired signal. *Limit
2* is fixed at 66 degrees.
You do not need to use a selector string to read this result for default signal and result 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 and results.
Args:
selector_string (string):
Pass an empty string.
Returns:
Tuple (attr_val, error_code):
attr_val (int):
Returns the number of times the phase discontinuity values exceed the *Limit 2* value for the acquired signal. *Limit
2* is fixed at 66 degrees.
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.SLOTPHASE_RESULTS_DISCONTINUITY_COUNT_GREATER_THAN_LIMIT2.value,
)
finally:
self._session_function_lock.exit_read_lock()
return attr_val, error_code
[docs]
@_raise_if_disposed
def get_discontinuity_minimum_distance(self, selector_string):
r"""Gets the minimum distance between two phase discontinuity measurements exceeding the *Limit 1* value. *Limit 1* is
fixed at 36 degrees. This value is expressed in slots.
You do not need to use a selector string to read this result for default signal and result 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 and results.
If there are no phase discontinuity values greater than *Limit 1*, or if there is only one phase discontinuity
value greater than *Limit 1*, this result is not valid. In such a case, -1 is reported as the result.
Args:
selector_string (string):
Pass an empty string.
Returns:
Tuple (attr_val, error_code):
attr_val (int):
Returns the minimum distance between two phase discontinuity measurements exceeding the *Limit 1* value. *Limit 1* is
fixed at 36 degrees. This value is expressed in slots.
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.SLOTPHASE_RESULTS_DISCONTINUITY_MINIMUM_DISTANCE.value,
)
finally:
self._session_function_lock.exit_read_lock()
return attr_val, error_code
[docs]
@_raise_if_disposed
def fetch_measurement(self, selector_string, timeout):
r"""Fetches the maximum phase discontinuity, discontinuity count greater than Limit 1, discontinuity count greater than
Limit 2, and discontinuity minimum distance results.
Args:
selector_string (string):
This parameter specifies a `Selector String
<https://www.ni.com/docs/en-US/bundle/rfmx/page/selector-strings-net.html>`_ comprising of the signal name and result
name.
Example:
"result::r1"
You can use the :py:meth:`build_result_string` method to build the selector string.
timeout (float):
This parameter specifies the time for which the method waits for the measurement to complete. This value is expressed
in seconds. A value of -1 specifies that the method waits until the measurement is complete. The default value is 10.
Returns:
Tuple (maximum_phase_discontinuity, discontinuity_count_greater_than_limit1, discontinuity_count_greater_than_limit2, discontinuity_minimum_distance, error_code):
maximum_phase_discontinuity (float):
This parameter returns the maximum of all the measured phase discontinuity values at the slot boundaries.
This value is expressed in degrees.
discontinuity_count_greater_than_limit1 (int):
This parameter returns the number of times the phase discontinuity values exceed the *Limit 1* value for the acquired
signal. *Limit 1* is fixed at 36 degrees.
discontinuity_count_greater_than_limit2 (int):
This parameter returns the number of times the phase discontinuity values exceed the *Limit 2* value for the acquired
signal. *Limit 2* is fixed at 66 degrees.
discontinuity_minimum_distance (int):
This parameter returns the minimum distance between two phase discontinuity measurements exceeding the *Limit 1* value.
*Limit 1* is fixed at 36 degrees. This value is expressed in slots.
If there are no phase discontinuity values greater than *Limit 1*, or if there is only one phase discontinuity value
greater than *Limit 1*, this result is not valid. In such a case, -1 is reported as the result.
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()
_helper.validate_not_none(selector_string, "selector_string")
updated_selector_string = _helper.validate_and_update_selector_string(
selector_string, self._signal_obj
)
(
maximum_phase_discontinuity,
discontinuity_count_greater_than_limit1,
discontinuity_count_greater_than_limit2,
discontinuity_minimum_distance,
error_code,
) = self._interpreter.slotphase_fetch_measurement(updated_selector_string, timeout)
finally:
self._session_function_lock.exit_read_lock()
return (
maximum_phase_discontinuity,
discontinuity_count_greater_than_limit1,
discontinuity_count_greater_than_limit2,
discontinuity_minimum_distance,
error_code,
)
[docs]
@_raise_if_disposed
def fetch_phase_discontinuities(self, selector_string, timeout):
r"""Fetches the phase discontinuity values for the slot phase measurement.
Args:
selector_string (string):
This parameter specifies a `Selector String
<https://www.ni.com/docs/en-US/bundle/rfmx/page/selector-strings-net.html>`_ comprising of the signal name and result
name.
Example:
"result::r1"
You can use the :py:meth:`build_result_string` method to build the selector string.
timeout (float):
This parameter specifies the time for which the method waits for the measurement to complete. This value is expressed
in seconds. A value of -1 specifies that the method waits until the measurement is complete. The default value is 10.
Returns:
Tuple (slot_phase_discontinuity, error_code):
slot_phase_discontinuity (float):
This parameter returns the difference between the first extrapolated linear chip phase of the current slot and the last
extrapolated linear chip phase of the preceding slot. The extrapolation is for the exclusion period of 25us on either
side of the slot boundary. If you set the
:py:attr:`~nirfmxwcdma.attributes.AttributeID.SLOTPHASE_TRANSIENT_REMOVAL_ENABLED` attribute to **False**, this
parameter returns the difference between the first and last linear chip phase, at each slot boundary.
This value is expressed in degrees.
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()
_helper.validate_not_none(selector_string, "selector_string")
updated_selector_string = _helper.validate_and_update_selector_string(
selector_string, self._signal_obj
)
slot_phase_discontinuity, error_code = (
self._interpreter.slotphase_fetch_phase_discontinuities(
updated_selector_string, timeout
)
)
finally:
self._session_function_lock.exit_read_lock()
return slot_phase_discontinuity, error_code
[docs]
@_raise_if_disposed
def fetch_chip_phase_error_trace(self, selector_string, timeout, chip_phase_error):
r"""Fetches the chip phase error trace for the SlotPhase measurement.
Args:
selector_string (string):
This parameter specifies a `Selector String
<https://www.ni.com/docs/en-US/bundle/rfmx/page/selector-strings-net.html>`_ comprising of result
name.
Example:
"result::r1"
You can use the :py:meth:`build_result_string` method to build the selector string.
timeout (float):
This parameter specifies the time for which the method waits for the measurement to complete. This value is expressed
in seconds. A value of -1 specifies that the method waits until the measurement is complete. The default value is 10.
chip_phase_error (numpy.float32):
This parameter returns an array of phase error values. This value is expressed in degrees.
Returns:
Tuple (x0, dx, error_code):
x0 (float):
This parameter returns the start time. This value is expressed in seconds.
dx (float):
This parameter returns the chip duration. This value is expressed in seconds.
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()
_helper.validate_not_none(selector_string, "selector_string")
updated_selector_string = _helper.validate_and_update_selector_string(
selector_string, self._signal_obj
)
x0, dx, error_code = self._interpreter.slotphase_fetch_chip_phase_error_trace(
updated_selector_string, timeout, chip_phase_error
)
finally:
self._session_function_lock.exit_read_lock()
return x0, dx, error_code
[docs]
@_raise_if_disposed
def fetch_chip_phase_error_linear_fit_trace(
self, selector_string, timeout, chip_phase_error_linear_fit
):
r"""Fetches the chip phase error linear fit trace for the SlotPhase measurement.
Args:
selector_string (string):
This parameter specifies a `Selector String
<https://www.ni.com/docs/en-US/bundle/rfmx/page/selector-strings-net.html>`_ comprising of result
name.
Example:
"result::r1"
You can use the :py:meth:`build_result_string` method to build the selector string.
timeout (float):
This parameter specifies the time for which the method waits for the measurement to complete. This value is expressed
in seconds. A value of -1 specifies that the method waits until the measurement is complete. The default value is 10.
chip_phase_error_linear_fit (numpy.float32):
This parameter returns the linear-fit chip phase error values. This value is expressed in degrees.
Returns:
Tuple (x0, dx, error_code):
x0 (float):
This parameter returns the start time. This value is expressed in seconds.
dx (float):
This parameter returns the chip duration. This value is expressed in seconds.
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()
_helper.validate_not_none(selector_string, "selector_string")
updated_selector_string = _helper.validate_and_update_selector_string(
selector_string, self._signal_obj
)
x0, dx, error_code = (
self._interpreter.slotphase_fetch_chip_phase_error_linear_fit_trace(
updated_selector_string, timeout, chip_phase_error_linear_fit
)
)
finally:
self._session_function_lock.exit_read_lock()
return x0, dx, error_code