Source code for nirfmxwcdma.wcdma

"""Defines a root class which is used to identify and control Wcdma signal configuration."""

import functools
import math

import nirfmxinstr
import nirfmxwcdma.acp as acp
import nirfmxwcdma.attributes as attributes
import nirfmxwcdma.cda as cda
import nirfmxwcdma.chp as chp
import nirfmxwcdma.enums as enums
import nirfmxwcdma.errors as errors
import nirfmxwcdma.internal._helper as _helper
import nirfmxwcdma.modacc as modacc
import nirfmxwcdma.obw as obw
import nirfmxwcdma.qevm as qevm
import nirfmxwcdma.sem as sem
import nirfmxwcdma.slotphase as slotphase
import nirfmxwcdma.slotpower as slotpower
from nirfmxwcdma.internal._helper import SignalConfiguration


class _WcdmaSignalConfiguration:
    """Contains static methods to create and delete Wcdma signal."""

    @staticmethod
    def get_wcdma_signal_configuration(instr_session, signal_name="", cloning=False):
        updated_signal_name = signal_name
        if signal_name:
            updated_signal_name = _helper.validate_and_remove_signal_qualifier(
                signal_name, "signal_name"
            )
            _helper.validate_signal_not_empty(updated_signal_name, "signal_name")
        return _WcdmaSignalConfiguration.init(instr_session, updated_signal_name, cloning)  # type: ignore

    @staticmethod
    def init(instr_session, signal_name, cloning):
        with instr_session._signal_lock:
            if signal_name.lower() == Wcdma._default_signal_name_user_visible.lower():
                signal_name = Wcdma._default_signal_name

            existing_signal = instr_session._signal_manager.find_signal_configuration(
                Wcdma._signal_configuration_type, signal_name
            )
            if existing_signal is None:
                signal_configuration = Wcdma(instr_session, signal_name, cloning)  # type: ignore
                instr_session._signal_manager.add_signal_configuration(signal_configuration)
            else:
                signal_configuration = existing_signal
                # Checking if signal exists in C layer
                if signal_configuration._interpreter.check_if_current_signal_exists() is False:
                    if not signal_configuration.signal_configuration_name.lower():
                        instr_session._interpreter.create_default_signal_configuration(
                            Wcdma._default_signal_name_user_visible,
                            int(math.log(nirfmxinstr.Personalities.WCDMA.value, 2.0)) + 1,
                        )
                    else:
                        signal_configuration._interpreter.create_signal_configuration(signal_name)

            return signal_configuration

    @staticmethod
    def remove_signal_configuration(instr_session, signal_configuration):
        with instr_session._signal_lock:
            instr_session._signal_manager.remove_signal_configuration(signal_configuration)


def _raise_if_disposed(f):
    """From https://stackoverflow.com/questions/5929107/decorators-with-parameters."""

    @functools.wraps(f)
    def aux(*xs, **kws):
        signal = xs[0]  # parameter 0 is 'self' which is the signal object
        if signal.is_disposed:
            raise Exception("Cannot access a disposed Wcdma signal configuration")
        return f(*xs, **kws)

    return aux


class _WcdmaBase(SignalConfiguration):
    """Defines a base class for Wcdma."""

    _default_signal_name = ""
    _default_signal_name_user_visible = "default@WCDMA"
    _signal_configuration_type = "<'nirfmxwcdma.wcdma.Wcdma'>"

    def __init__(self, session, signal_name="", cloning=False):
        self.is_disposed = False
        self._rfmxinstrsession = session
        self._rfmxinstrsession_interpreter = session._interpreter
        self.signal_configuration_name = signal_name
        self.signal_configuration_type = type(self)  # type: ignore
        self._signal_configuration_mode = "Signal"
        if session._is_remote_session:
            import nirfmxwcdma.internal._grpc_stub_interpreter as _grpc_stub_interpreter

            interpreter = _grpc_stub_interpreter.GrpcStubInterpreter(session._grpc_options, session, self)  # type: ignore
        else:
            from nirfmxwcdma.internal._library_interpreter import LibraryInterpreter

            interpreter = LibraryInterpreter("windows-1251", session, self)  # type: ignore

        self._interpreter = interpreter
        self._interpreter.set_session_handle(self._rfmxinstrsession_interpreter._vi)  # type: ignore
        self._session_function_lock = _helper.SessionFunctionLock()

        # Measurements object
        self.modacc = modacc.ModAcc(self)  # type: ignore
        self.acp = acp.Acp(self)  # type: ignore
        self.chp = chp.Chp(self)  # type: ignore
        self.obw = obw.Obw(self)  # type: ignore
        self.sem = sem.Sem(self)  # type: ignore
        self.qevm = qevm.Qevm(self)  # type: ignore
        self.slotphase = slotphase.SlotPhase(self)  # type: ignore
        self.cda = cda.Cda(self)  # type: ignore
        self.slotpower = slotpower.SlotPower(self)  # type: ignore

        if not signal_name and not cloning:
            signal_exists, personality, _ = (
                self._rfmxinstrsession_interpreter.check_if_signal_exists(
                    self._default_signal_name_user_visible
                )
            )
            if not (signal_exists and personality.value == nirfmxinstr.Personalities.WCDMA.value):
                self._rfmxinstrsession_interpreter.create_default_signal_configuration(
                    self._default_signal_name_user_visible,
                    int(math.log(nirfmxinstr.Personalities.WCDMA.value, 2.0)) + 1,
                )
        elif signal_name and not cloning:
            signal_exists, personality, _ = (
                self._rfmxinstrsession_interpreter.check_if_signal_exists(signal_name)
            )
            if not (signal_exists and personality.value == nirfmxinstr.Personalities.WCDMA.value):
                self._interpreter.create_signal_configuration(signal_name)  # type: ignore

    def __enter__(self):
        """Enters the context of the Wcdma signal configuration."""
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        """Exits the context of the Wcdma signal configuration."""
        self.dispose()  # type: ignore
        pass

    def dispose(self):
        r"""Deletes the signal configuration if it is not the default signal configuration
        and clears any trace of the current signal configuration, if any.

        .. note::
            You can call this function safely more than once, even if the signal is already deleted.
        """
        if not self.is_disposed:
            if self.signal_configuration_name == self._default_signal_name:
                self.is_disposed = True
                return
            else:
                _ = self._delete_signal_configuration(True)  # type: ignore
                self.is_disposed = True

    @_raise_if_disposed
    def delete_signal_configuration(self):
        r"""Deletes the current instance of a signal.

        Returns:
            error_code:
                Returns the status code of this method.
                The status code either indicates success or describes a warning condition.
        """
        error_code = self._delete_signal_configuration(False)  # type: ignore
        return error_code

    def _delete_signal_configuration(self, ignore_driver_error):
        error_code = 0
        try:
            if not self.is_disposed:
                self._session_function_lock.enter_write_lock()
                error_code = self._interpreter.delete_signal_configuration(ignore_driver_error)  # type: ignore
                _WcdmaSignalConfiguration.remove_signal_configuration(self._rfmxinstrsession, self)  # type: ignore
                self.is_disposed = True
        finally:
            self._session_function_lock.exit_write_lock()

        return error_code

    @_raise_if_disposed
    def get_warning(self):
        r"""Retrieves and then clears the warning information for the session.

        Returns:
            Tuple (warning_code, warning_message):

            warning_code (int):
                Contains the latest warning code.

            warning_message (string):
                Contains the latest warning description.
        """
        try:
            self._session_function_lock.enter_read_lock()
            warning_code, warning_message = self._interpreter.get_error()  # type: ignore
        finally:
            self._session_function_lock.exit_read_lock()

        return warning_code, warning_message

    @_raise_if_disposed
    def get_error_string(self, error_code):
        r"""Gets the description of a driver error code.

        Args:
            error_code (int):
                Specifies an error or warning code.

        Returns:
            string:
                Contains the error description.
        """
        try:
            self._session_function_lock.enter_read_lock()
            error_message = self._interpreter.get_error_string(error_code)  # type: ignore
        finally:
            self._session_function_lock.exit_read_lock()

        return error_message

    @_raise_if_disposed
    def reset_attribute(self, selector_string, attribute_id):
        r"""Resets the attribute to its default value.

        Args:
            selector_string (string):
                Specifies the selector string for the property being reset.

            attribute_id (PropertyId):
                Specifies an attribute identifier.

        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()
            _helper.validate_not_none(selector_string, "selector_string")
            updated_selector_string = _helper.validate_and_update_selector_string(
                selector_string, self
            )
            attribute_id = (
                attribute_id.value if type(attribute_id) is attributes.AttributeID else attribute_id
            )
            error_code = self._interpreter.reset_attribute(  # type: ignore
                updated_selector_string, attribute_id
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def get_selected_ports(self, selector_string):
        r"""Gets the instrument port to be configured to acquire a signal. Use
        :py:meth:`nirfmxinstr.session.Session.get_available_ports` method to get the valid port names.

        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.

        **Valid values**

        +----------------+--------------------------------------------------------------------------------------------------------------------------+
        | Name (value)   | Description                                                                                                              |
        +================+==========================================================================================================================+
        | PXIe-5830      | if0, if1                                                                                                                 |
        +----------------+--------------------------------------------------------------------------------------------------------------------------+
        | PXIe-5831/5832 | if0, if1, rf<0-1>/port<x>, where 0-1 indicates one (0) or two (1) mmRH-5582 connections and x is the port number on the  |
        |                | mmRH-5582 front panel                                                                                                    |
        +----------------+--------------------------------------------------------------------------------------------------------------------------+
        | Other devices  | "" (empty string)                                                                                                        |
        +----------------+--------------------------------------------------------------------------------------------------------------------------+

        **Default values**

        +---------------------+-------------------+
        | Name (value)        | Description       |
        +=====================+===================+
        | PXIe-5830/5831/5832 | if1               |
        +---------------------+-------------------+
        | Other devices       | "" (empty string) |
        +---------------------+-------------------+

        Args:
            selector_string (string):
                Pass an empty string.

        Returns:
            Tuple (attr_val, error_code):

            attr_val (string):
                Specifies the instrument port to be configured to acquire a signal. Use
                :py:meth:`nirfmxinstr.session.Session.get_available_ports` method to get the valid port names.

            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
            )
            attr_val, error_code = self._interpreter.get_attribute_string(  # type: ignore
                updated_selector_string, attributes.AttributeID.SELECTED_PORTS.value
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return attr_val, error_code

    @_raise_if_disposed
    def set_selected_ports(self, selector_string, value):
        r"""Sets the instrument port to be configured to acquire a signal. Use
        :py:meth:`nirfmxinstr.session.Session.get_available_ports` method to get the valid port names.

        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.

        **Valid values**

        +----------------+--------------------------------------------------------------------------------------------------------------------------+
        | Name (value)   | Description                                                                                                              |
        +================+==========================================================================================================================+
        | PXIe-5830      | if0, if1                                                                                                                 |
        +----------------+--------------------------------------------------------------------------------------------------------------------------+
        | PXIe-5831/5832 | if0, if1, rf<0-1>/port<x>, where 0-1 indicates one (0) or two (1) mmRH-5582 connections and x is the port number on the  |
        |                | mmRH-5582 front panel                                                                                                    |
        +----------------+--------------------------------------------------------------------------------------------------------------------------+
        | Other devices  | "" (empty string)                                                                                                        |
        +----------------+--------------------------------------------------------------------------------------------------------------------------+

        **Default values**

        +---------------------+-------------------+
        | Name (value)        | Description       |
        +=====================+===================+
        | PXIe-5830/5831/5832 | if1               |
        +---------------------+-------------------+
        | Other devices       | "" (empty string) |
        +---------------------+-------------------+

        Args:
            selector_string (string):
                Pass an empty string.

            value (string):
                Specifies the instrument port to be configured to acquire a signal. Use
                :py:meth:`nirfmxinstr.session.Session.get_available_ports` method to get the valid port names.

        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
            )
            _helper.validate_not_none(value, "value")
            error_code = self._interpreter.set_attribute_string(  # type: ignore
                updated_selector_string, attributes.AttributeID.SELECTED_PORTS.value, value
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def get_center_frequency(self, selector_string):
        r"""For a single-carrier measurement, this attribute specifies the center frequency of the acquired RF signal.

        For multi-carrier measurements, this attribute specifies the reference frequency for the values in the
        :py:attr:`~nirfmxwcdma.attributes.AttributeID.CARRIER_FREQUENCY` attribute.

        This value is expressed in Hz.

        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 this attribute is hardware dependent.

        Args:
            selector_string (string):
                Pass an empty string.

        Returns:
            Tuple (attr_val, error_code):

            attr_val (float):
                For a single-carrier measurement, this attribute specifies the center frequency of the acquired RF 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
            )
            attr_val, error_code = self._interpreter.get_attribute_f64(  # type: ignore
                updated_selector_string, attributes.AttributeID.CENTER_FREQUENCY.value
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return attr_val, error_code

    @_raise_if_disposed
    def set_center_frequency(self, selector_string, value):
        r"""For a single-carrier measurement, this attribute specifies the center frequency of the acquired RF signal.

        For multi-carrier measurements, this attribute specifies the reference frequency for the values in the
        :py:attr:`~nirfmxwcdma.attributes.AttributeID.CARRIER_FREQUENCY` attribute.

        This value is expressed in Hz.

        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 this attribute is hardware dependent.

        Args:
            selector_string (string):
                Pass an empty string.

            value (float):
                For a single-carrier measurement, this attribute specifies the center frequency of the acquired RF 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
            )
            error_code = self._interpreter.set_attribute_f64(  # type: ignore
                updated_selector_string, attributes.AttributeID.CENTER_FREQUENCY.value, value
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def get_reference_level(self, selector_string):
        r"""Gets the reference level that represents the maximum expected power of the RF input signal. This value is
        expressed in dBm for RF devices and V\ :sub:`pk-pk`\ for baseband devices.

        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 of this attribute is hardware dependent.

        Args:
            selector_string (string):
                Pass an empty string.

        Returns:
            Tuple (attr_val, error_code):

            attr_val (float):
                Specifies the reference level that represents the maximum expected power of the RF input signal. This value is
                expressed in dBm for RF devices and V\ :sub:`pk-pk`\ for baseband devices.

            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
            )
            attr_val, error_code = self._interpreter.get_attribute_f64(  # type: ignore
                updated_selector_string, attributes.AttributeID.REFERENCE_LEVEL.value
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return attr_val, error_code

    @_raise_if_disposed
    def set_reference_level(self, selector_string, value):
        r"""Sets the reference level that represents the maximum expected power of the RF input signal. This value is
        expressed in dBm for RF devices and V\ :sub:`pk-pk`\ for baseband devices.

        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 of this attribute is hardware dependent.

        Args:
            selector_string (string):
                Pass an empty string.

            value (float):
                Specifies the reference level that represents the maximum expected power of the RF input signal. This value is
                expressed in dBm for RF devices and V\ :sub:`pk-pk`\ for baseband devices.

        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
            )
            error_code = self._interpreter.set_attribute_f64(  # type: ignore
                updated_selector_string, attributes.AttributeID.REFERENCE_LEVEL.value, value
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def get_external_attenuation(self, selector_string):
        r"""Gets the attenuation of a switch or cable connected to the RF IN connector of the signal analyzer.

        This value is expressed in dB.

        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.

        For more information about attenuation, refer to the RF Attenuation and Signal Levels topic for your device in
        the *NI RF Vector Signal Analyzers Help*.

        The default value is 0.

        Args:
            selector_string (string):
                Pass an empty string.

        Returns:
            Tuple (attr_val, error_code):

            attr_val (float):
                Specifies the attenuation of a switch or cable connected to the RF IN connector of the signal analyzer.

            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
            )
            attr_val, error_code = self._interpreter.get_attribute_f64(  # type: ignore
                updated_selector_string, attributes.AttributeID.EXTERNAL_ATTENUATION.value
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return attr_val, error_code

    @_raise_if_disposed
    def set_external_attenuation(self, selector_string, value):
        r"""Sets the attenuation of a switch or cable connected to the RF IN connector of the signal analyzer.

        This value is expressed in dB.

        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.

        For more information about attenuation, refer to the RF Attenuation and Signal Levels topic for your device in
        the *NI RF Vector Signal Analyzers Help*.

        The default value is 0.

        Args:
            selector_string (string):
                Pass an empty string.

            value (float):
                Specifies the attenuation of a switch or cable connected to the RF IN connector of the signal analyzer.

        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
            )
            error_code = self._interpreter.set_attribute_f64(  # type: ignore
                updated_selector_string, attributes.AttributeID.EXTERNAL_ATTENUATION.value, value
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def get_reference_level_headroom(self, selector_string):
        r"""Gets the margin RFmx adds to the :py:attr:`~nirfmxwcdma.attributes.AttributeID.REFERENCE_LEVEL` attribute. The
        margin avoids clipping and overflow warnings if the input signal exceeds the configured reference level.

        RFmx configures the input gain to avoid clipping and associated overflow warnings provided the instantaneous
        power of the input signal remains within the Reference Level plus the Reference Level Headroom. If you know the input
        power of the signal precisely or previously included the margin in the Reference Level, you could improve the
        signal-to-noise ratio by reducing the Reference Level Headroom.

        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.

        **Supported devices: **PXIe-5668R, PXIe-5830/5831/5832/5840/5841/5842/5860.

        **Default values**

        +------------------------------------+-------------+
        | Name (value)                       | Description |
        +====================================+=============+
        | PXIe-5668                          | 6 dB        |
        +------------------------------------+-------------+
        | PXIe-5830/5831/5832/5841/5842/5860 | 1 dB        |
        +------------------------------------+-------------+
        | PXIe-5840                          | 0 dB        |
        +------------------------------------+-------------+

        Args:
            selector_string (string):
                Pass an empty string.

        Returns:
            Tuple (attr_val, error_code):

            attr_val (float):
                Specifies the margin RFmx adds to the :py:attr:`~nirfmxwcdma.attributes.AttributeID.REFERENCE_LEVEL` attribute. The
                margin avoids clipping and overflow warnings if the input signal exceeds the configured reference level.

            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
            )
            attr_val, error_code = self._interpreter.get_attribute_f64(  # type: ignore
                updated_selector_string, attributes.AttributeID.REFERENCE_LEVEL_HEADROOM.value
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return attr_val, error_code

    @_raise_if_disposed
    def set_reference_level_headroom(self, selector_string, value):
        r"""Sets the margin RFmx adds to the :py:attr:`~nirfmxwcdma.attributes.AttributeID.REFERENCE_LEVEL` attribute. The
        margin avoids clipping and overflow warnings if the input signal exceeds the configured reference level.

        RFmx configures the input gain to avoid clipping and associated overflow warnings provided the instantaneous
        power of the input signal remains within the Reference Level plus the Reference Level Headroom. If you know the input
        power of the signal precisely or previously included the margin in the Reference Level, you could improve the
        signal-to-noise ratio by reducing the Reference Level Headroom.

        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.

        **Supported devices: **PXIe-5668R, PXIe-5830/5831/5832/5840/5841/5842/5860.

        **Default values**

        +------------------------------------+-------------+
        | Name (value)                       | Description |
        +====================================+=============+
        | PXIe-5668                          | 6 dB        |
        +------------------------------------+-------------+
        | PXIe-5830/5831/5832/5841/5842/5860 | 1 dB        |
        +------------------------------------+-------------+
        | PXIe-5840                          | 0 dB        |
        +------------------------------------+-------------+

        Args:
            selector_string (string):
                Pass an empty string.

            value (float):
                Specifies the margin RFmx adds to the :py:attr:`~nirfmxwcdma.attributes.AttributeID.REFERENCE_LEVEL` attribute. The
                margin avoids clipping and overflow warnings if the input signal exceeds the configured reference level.

        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
            )
            error_code = self._interpreter.set_attribute_f64(  # type: ignore
                updated_selector_string,
                attributes.AttributeID.REFERENCE_LEVEL_HEADROOM.value,
                value,
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def get_trigger_type(self, selector_string):
        r"""Gets the trigger type.

        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 **None**.

        +-------------------+--------------------------------------------------------------------------------------------------------------------------+
        | Name (Value)      | Description                                                                                                              |
        +===================+==========================================================================================================================+
        | None (0)          | No Reference Trigger is configured.                                                                                      |
        +-------------------+--------------------------------------------------------------------------------------------------------------------------+
        | Digital Edge (1)  | The Reference Trigger is not asserted until a digital edge is detected. The source of the digital edge is specified      |
        |                   | using the Digital Edge Source attribute.                                                                                 |
        +-------------------+--------------------------------------------------------------------------------------------------------------------------+
        | IQ Power Edge (2) | The Reference Trigger is asserted when the signal changes past the level specified by the slope (rising or falling),     |
        |                   | which is configured using the IQ Power Edge Slope attribute.                                                             |
        +-------------------+--------------------------------------------------------------------------------------------------------------------------+
        | Software (3)      | The Reference Trigger is not asserted until a software trigger occurs.                                                   |
        +-------------------+--------------------------------------------------------------------------------------------------------------------------+

        Args:
            selector_string (string):
                Pass an empty string.

        Returns:
            Tuple (attr_val, error_code):

            attr_val (enums.TriggerType):
                Specifies the trigger type.

            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
            )
            attr_val, error_code = self._interpreter.get_attribute_i32(  # type: ignore
                updated_selector_string, attributes.AttributeID.TRIGGER_TYPE.value
            )
            attr_val = enums.TriggerType(attr_val)
        except (KeyError, ValueError):
            raise errors.DriverTooNewError()  # type: ignore
        finally:
            self._session_function_lock.exit_read_lock()

        return attr_val, error_code

    @_raise_if_disposed
    def set_trigger_type(self, selector_string, value):
        r"""Sets the trigger type.

        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 **None**.

        +-------------------+--------------------------------------------------------------------------------------------------------------------------+
        | Name (Value)      | Description                                                                                                              |
        +===================+==========================================================================================================================+
        | None (0)          | No Reference Trigger is configured.                                                                                      |
        +-------------------+--------------------------------------------------------------------------------------------------------------------------+
        | Digital Edge (1)  | The Reference Trigger is not asserted until a digital edge is detected. The source of the digital edge is specified      |
        |                   | using the Digital Edge Source attribute.                                                                                 |
        +-------------------+--------------------------------------------------------------------------------------------------------------------------+
        | IQ Power Edge (2) | The Reference Trigger is asserted when the signal changes past the level specified by the slope (rising or falling),     |
        |                   | which is configured using the IQ Power Edge Slope attribute.                                                             |
        +-------------------+--------------------------------------------------------------------------------------------------------------------------+
        | Software (3)      | The Reference Trigger is not asserted until a software trigger occurs.                                                   |
        +-------------------+--------------------------------------------------------------------------------------------------------------------------+

        Args:
            selector_string (string):
                Pass an empty string.

            value (enums.TriggerType, int):
                Specifies the trigger type.

        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
            )
            value = value.value if type(value) is enums.TriggerType else value
            error_code = self._interpreter.set_attribute_i32(  # type: ignore
                updated_selector_string, attributes.AttributeID.TRIGGER_TYPE.value, value
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def get_digital_edge_trigger_source(self, selector_string):
        r"""Gets the source terminal for the digital edge trigger.

        This attribute is used only when you set the :py:attr:`~nirfmxwcdma.attributes.AttributeID.TRIGGER_TYPE`
        attribute to **Digital Edge**.

        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 of this attribute is hardware dependent.

        Args:
            selector_string (string):
                Pass an empty string.

        Returns:
            Tuple (attr_val, error_code):

            attr_val (string):
                Specifies the source terminal for the digital edge trigger.

            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
            )
            attr_val, error_code = self._interpreter.get_attribute_string(  # type: ignore
                updated_selector_string, attributes.AttributeID.DIGITAL_EDGE_TRIGGER_SOURCE.value
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return attr_val, error_code

    @_raise_if_disposed
    def set_digital_edge_trigger_source(self, selector_string, value):
        r"""Sets the source terminal for the digital edge trigger.

        This attribute is used only when you set the :py:attr:`~nirfmxwcdma.attributes.AttributeID.TRIGGER_TYPE`
        attribute to **Digital Edge**.

        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 of this attribute is hardware dependent.

        Args:
            selector_string (string):
                Pass an empty string.

            value (string):
                Specifies the source terminal for the digital edge trigger.

        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
            )
            _helper.validate_not_none(value, "value")
            error_code = self._interpreter.set_attribute_string(  # type: ignore
                updated_selector_string,
                attributes.AttributeID.DIGITAL_EDGE_TRIGGER_SOURCE.value,
                value,
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def get_digital_edge_trigger_edge(self, selector_string):
        r"""Gets the active edge for the trigger.

        This attribute is used only when you set the :py:attr:`~nirfmxwcdma.attributes.AttributeID.TRIGGER_TYPE`
        attribute to **Digital Edge**.

        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 **Rising Edge**.

        +------------------+--------------------------------------------------------+
        | Name (Value)     | Description                                            |
        +==================+========================================================+
        | Rising Edge (0)  | The trigger asserts on the rising edge of the signal.  |
        +------------------+--------------------------------------------------------+
        | Falling Edge (1) | The trigger asserts on the falling edge of the signal. |
        +------------------+--------------------------------------------------------+

        Args:
            selector_string (string):
                Pass an empty string.

        Returns:
            Tuple (attr_val, error_code):

            attr_val (enums.DigitalEdgeTriggerEdge):
                Specifies the active edge for the trigger.

            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
            )
            attr_val, error_code = self._interpreter.get_attribute_i32(  # type: ignore
                updated_selector_string, attributes.AttributeID.DIGITAL_EDGE_TRIGGER_EDGE.value
            )
            attr_val = enums.DigitalEdgeTriggerEdge(attr_val)
        except (KeyError, ValueError):
            raise errors.DriverTooNewError()  # type: ignore
        finally:
            self._session_function_lock.exit_read_lock()

        return attr_val, error_code

    @_raise_if_disposed
    def set_digital_edge_trigger_edge(self, selector_string, value):
        r"""Sets the active edge for the trigger.

        This attribute is used only when you set the :py:attr:`~nirfmxwcdma.attributes.AttributeID.TRIGGER_TYPE`
        attribute to **Digital Edge**.

        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 **Rising Edge**.

        +------------------+--------------------------------------------------------+
        | Name (Value)     | Description                                            |
        +==================+========================================================+
        | Rising Edge (0)  | The trigger asserts on the rising edge of the signal.  |
        +------------------+--------------------------------------------------------+
        | Falling Edge (1) | The trigger asserts on the falling edge of the signal. |
        +------------------+--------------------------------------------------------+

        Args:
            selector_string (string):
                Pass an empty string.

            value (enums.DigitalEdgeTriggerEdge, int):
                Specifies the active edge for the trigger.

        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
            )
            value = value.value if type(value) is enums.DigitalEdgeTriggerEdge else value
            error_code = self._interpreter.set_attribute_i32(  # type: ignore
                updated_selector_string,
                attributes.AttributeID.DIGITAL_EDGE_TRIGGER_EDGE.value,
                value,
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def get_iq_power_edge_trigger_source(self, selector_string):
        r"""Gets the channel from which the device monitors the trigger. This attribute is used only when you set the
        :py:attr:`~nirfmxwcdma.attributes.AttributeID.TRIGGER_TYPE` attribute to **IQ Power Edge**.

        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 of this attribute is hardware dependent.

        Args:
            selector_string (string):
                Pass an empty string.

        Returns:
            Tuple (attr_val, error_code):

            attr_val (string):
                Specifies the channel from which the device monitors the trigger. This attribute is used only when you set the
                :py:attr:`~nirfmxwcdma.attributes.AttributeID.TRIGGER_TYPE` attribute to **IQ Power Edge**.

            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
            )
            attr_val, error_code = self._interpreter.get_attribute_string(  # type: ignore
                updated_selector_string, attributes.AttributeID.IQ_POWER_EDGE_TRIGGER_SOURCE.value
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return attr_val, error_code

    @_raise_if_disposed
    def set_iq_power_edge_trigger_source(self, selector_string, value):
        r"""Sets the channel from which the device monitors the trigger. This attribute is used only when you set the
        :py:attr:`~nirfmxwcdma.attributes.AttributeID.TRIGGER_TYPE` attribute to **IQ Power Edge**.

        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 of this attribute is hardware dependent.

        Args:
            selector_string (string):
                Pass an empty string.

            value (string):
                Specifies the channel from which the device monitors the trigger. This attribute is used only when you set the
                :py:attr:`~nirfmxwcdma.attributes.AttributeID.TRIGGER_TYPE` attribute to **IQ Power Edge**.

        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
            )
            _helper.validate_not_none(value, "value")
            error_code = self._interpreter.set_attribute_string(  # type: ignore
                updated_selector_string,
                attributes.AttributeID.IQ_POWER_EDGE_TRIGGER_SOURCE.value,
                value,
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def get_iq_power_edge_trigger_level(self, selector_string):
        r"""Gets the power level at which the device triggers.

        This value is expressed in dB when the
        :py:attr:`~nirfmxwcdma.attributes.AttributeID.IQ_POWER_EDGE_TRIGGER_LEVEL_TYPE`  attribute is set to **Relative** and
        in dBm when the IQ Power Edge Level Type attribute is set to **Absolute**.

        The device asserts the trigger when the signal exceeds the level specified by the value of this attribute,
        taking into consideration the specified slope. This attribute is used only when you set the
        :py:attr:`~nirfmxwcdma.attributes.AttributeID.TRIGGER_TYPE` attribute to **IQ Power Edge**.

        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 of this attribute is hardware dependent.

        Args:
            selector_string (string):
                Pass an empty string.

        Returns:
            Tuple (attr_val, error_code):

            attr_val (float):
                Specifies the power level at which the device triggers.

            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
            )
            attr_val, error_code = self._interpreter.get_attribute_f64(  # type: ignore
                updated_selector_string, attributes.AttributeID.IQ_POWER_EDGE_TRIGGER_LEVEL.value
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return attr_val, error_code

    @_raise_if_disposed
    def set_iq_power_edge_trigger_level(self, selector_string, value):
        r"""Sets the power level at which the device triggers.

        This value is expressed in dB when the
        :py:attr:`~nirfmxwcdma.attributes.AttributeID.IQ_POWER_EDGE_TRIGGER_LEVEL_TYPE`  attribute is set to **Relative** and
        in dBm when the IQ Power Edge Level Type attribute is set to **Absolute**.

        The device asserts the trigger when the signal exceeds the level specified by the value of this attribute,
        taking into consideration the specified slope. This attribute is used only when you set the
        :py:attr:`~nirfmxwcdma.attributes.AttributeID.TRIGGER_TYPE` attribute to **IQ Power Edge**.

        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 of this attribute is hardware dependent.

        Args:
            selector_string (string):
                Pass an empty string.

            value (float):
                Specifies the power level at which the device triggers.

        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
            )
            error_code = self._interpreter.set_attribute_f64(  # type: ignore
                updated_selector_string,
                attributes.AttributeID.IQ_POWER_EDGE_TRIGGER_LEVEL.value,
                value,
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def get_iq_power_edge_trigger_level_type(self, selector_string):
        r"""Gets the reference for the :py:attr:`~nirfmxwcdma.attributes.AttributeID.IQ_POWER_EDGE_TRIGGER_LEVEL`  attribute.

        The IQ Power Edge Level Type attribute is used only when you set the
        :py:attr:`~nirfmxwcdma.attributes.AttributeID.TRIGGER_TYPE` attribute to **IQ Power Edge**.

        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 **Relative**.

        +--------------+----------------------------------------------------------------------------------------------+
        | Name (Value) | Description                                                                                  |
        +==============+==============================================================================================+
        | Relative (0) | The IQ Power Edge Level attribute is relative to the value of the Reference Level attribute. |
        +--------------+----------------------------------------------------------------------------------------------+
        | Absolute (1) | The IQ Power Edge Level attribute specifies the absolute power.                              |
        +--------------+----------------------------------------------------------------------------------------------+

        Args:
            selector_string (string):
                Pass an empty string.

        Returns:
            Tuple (attr_val, error_code):

            attr_val (enums.IQPowerEdgeTriggerLevelType):
                Specifies the reference for the :py:attr:`~nirfmxwcdma.attributes.AttributeID.IQ_POWER_EDGE_TRIGGER_LEVEL`  attribute.

            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
            )
            attr_val, error_code = self._interpreter.get_attribute_i32(  # type: ignore
                updated_selector_string,
                attributes.AttributeID.IQ_POWER_EDGE_TRIGGER_LEVEL_TYPE.value,
            )
            attr_val = enums.IQPowerEdgeTriggerLevelType(attr_val)
        except (KeyError, ValueError):
            raise errors.DriverTooNewError()  # type: ignore
        finally:
            self._session_function_lock.exit_read_lock()

        return attr_val, error_code

    @_raise_if_disposed
    def set_iq_power_edge_trigger_level_type(self, selector_string, value):
        r"""Sets the reference for the :py:attr:`~nirfmxwcdma.attributes.AttributeID.IQ_POWER_EDGE_TRIGGER_LEVEL`  attribute.

        The IQ Power Edge Level Type attribute is used only when you set the
        :py:attr:`~nirfmxwcdma.attributes.AttributeID.TRIGGER_TYPE` attribute to **IQ Power Edge**.

        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 **Relative**.

        +--------------+----------------------------------------------------------------------------------------------+
        | Name (Value) | Description                                                                                  |
        +==============+==============================================================================================+
        | Relative (0) | The IQ Power Edge Level attribute is relative to the value of the Reference Level attribute. |
        +--------------+----------------------------------------------------------------------------------------------+
        | Absolute (1) | The IQ Power Edge Level attribute specifies the absolute power.                              |
        +--------------+----------------------------------------------------------------------------------------------+

        Args:
            selector_string (string):
                Pass an empty string.

            value (enums.IQPowerEdgeTriggerLevelType, int):
                Specifies the reference for the :py:attr:`~nirfmxwcdma.attributes.AttributeID.IQ_POWER_EDGE_TRIGGER_LEVEL`  attribute.

        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
            )
            value = value.value if type(value) is enums.IQPowerEdgeTriggerLevelType else value
            error_code = self._interpreter.set_attribute_i32(  # type: ignore
                updated_selector_string,
                attributes.AttributeID.IQ_POWER_EDGE_TRIGGER_LEVEL_TYPE.value,
                value,
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def get_iq_power_edge_trigger_slope(self, selector_string):
        r"""Gets whether the device asserts the trigger when the signal power is rising or when it is falling.

        The device asserts the trigger when the signal power exceeds the specified level with the slope you specify.
        This attribute is used only when you set the :py:attr:`~nirfmxwcdma.attributes.AttributeID.TRIGGER_TYPE` attribute to
        **IQ Power Edge**.

        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 **Rising Slope**.

        +-------------------+-------------------------------------------------------+
        | Name (Value)      | Description                                           |
        +===================+=======================================================+
        | Rising Slope (0)  | The trigger asserts when the signal power is rising.  |
        +-------------------+-------------------------------------------------------+
        | Falling Slope (1) | The trigger asserts when the signal power is falling. |
        +-------------------+-------------------------------------------------------+

        Args:
            selector_string (string):
                Pass an empty string.

        Returns:
            Tuple (attr_val, error_code):

            attr_val (enums.IQPowerEdgeTriggerSlope):
                Specifies whether the device asserts the trigger when the signal power is rising or when it is falling.

            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
            )
            attr_val, error_code = self._interpreter.get_attribute_i32(  # type: ignore
                updated_selector_string, attributes.AttributeID.IQ_POWER_EDGE_TRIGGER_SLOPE.value
            )
            attr_val = enums.IQPowerEdgeTriggerSlope(attr_val)
        except (KeyError, ValueError):
            raise errors.DriverTooNewError()  # type: ignore
        finally:
            self._session_function_lock.exit_read_lock()

        return attr_val, error_code

    @_raise_if_disposed
    def set_iq_power_edge_trigger_slope(self, selector_string, value):
        r"""Sets whether the device asserts the trigger when the signal power is rising or when it is falling.

        The device asserts the trigger when the signal power exceeds the specified level with the slope you specify.
        This attribute is used only when you set the :py:attr:`~nirfmxwcdma.attributes.AttributeID.TRIGGER_TYPE` attribute to
        **IQ Power Edge**.

        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 **Rising Slope**.

        +-------------------+-------------------------------------------------------+
        | Name (Value)      | Description                                           |
        +===================+=======================================================+
        | Rising Slope (0)  | The trigger asserts when the signal power is rising.  |
        +-------------------+-------------------------------------------------------+
        | Falling Slope (1) | The trigger asserts when the signal power is falling. |
        +-------------------+-------------------------------------------------------+

        Args:
            selector_string (string):
                Pass an empty string.

            value (enums.IQPowerEdgeTriggerSlope, int):
                Specifies whether the device asserts the trigger when the signal power is rising or when it is falling.

        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
            )
            value = value.value if type(value) is enums.IQPowerEdgeTriggerSlope else value
            error_code = self._interpreter.set_attribute_i32(  # type: ignore
                updated_selector_string,
                attributes.AttributeID.IQ_POWER_EDGE_TRIGGER_SLOPE.value,
                value,
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def get_trigger_delay(self, selector_string):
        r"""Gets the trigger delay time.

        This value is expressed in seconds.

        If the delay is negative, the measurement acquires pretrigger samples. If the delay is positive, the
        measurement acquires post-trigger samples.

        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 0.

        Args:
            selector_string (string):
                Pass an empty string.

        Returns:
            Tuple (attr_val, error_code):

            attr_val (float):
                Specifies the trigger delay time.

            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
            )
            attr_val, error_code = self._interpreter.get_attribute_f64(  # type: ignore
                updated_selector_string, attributes.AttributeID.TRIGGER_DELAY.value
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return attr_val, error_code

    @_raise_if_disposed
    def set_trigger_delay(self, selector_string, value):
        r"""Sets the trigger delay time.

        This value is expressed in seconds.

        If the delay is negative, the measurement acquires pretrigger samples. If the delay is positive, the
        measurement acquires post-trigger samples.

        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 0.

        Args:
            selector_string (string):
                Pass an empty string.

            value (float):
                Specifies the trigger delay time.

        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
            )
            error_code = self._interpreter.set_attribute_f64(  # type: ignore
                updated_selector_string, attributes.AttributeID.TRIGGER_DELAY.value, value
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def get_trigger_minimum_quiet_time_mode(self, selector_string):
        r"""Gets whether the measurement computes the minimum quiet time used for triggering.

        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 **Manual**.

        +--------------+---------------------------------------------------------------------------------------------+
        | Name (Value) | Description                                                                                 |
        +==============+=============================================================================================+
        | Manual (0)   | The minimum quiet time for triggering is the value of the Trigger Min Quiet Time attribute. |
        +--------------+---------------------------------------------------------------------------------------------+
        | Auto (1)     | The measurement computes the minimum quiet time used for triggering.                        |
        +--------------+---------------------------------------------------------------------------------------------+

        Args:
            selector_string (string):
                Pass an empty string.

        Returns:
            Tuple (attr_val, error_code):

            attr_val (enums.TriggerMinimumQuietTimeMode):
                Specifies whether the measurement computes the minimum quiet time used for triggering.

            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
            )
            attr_val, error_code = self._interpreter.get_attribute_i32(  # type: ignore
                updated_selector_string,
                attributes.AttributeID.TRIGGER_MINIMUM_QUIET_TIME_MODE.value,
            )
            attr_val = enums.TriggerMinimumQuietTimeMode(attr_val)
        except (KeyError, ValueError):
            raise errors.DriverTooNewError()  # type: ignore
        finally:
            self._session_function_lock.exit_read_lock()

        return attr_val, error_code

    @_raise_if_disposed
    def set_trigger_minimum_quiet_time_mode(self, selector_string, value):
        r"""Sets whether the measurement computes the minimum quiet time used for triggering.

        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 **Manual**.

        +--------------+---------------------------------------------------------------------------------------------+
        | Name (Value) | Description                                                                                 |
        +==============+=============================================================================================+
        | Manual (0)   | The minimum quiet time for triggering is the value of the Trigger Min Quiet Time attribute. |
        +--------------+---------------------------------------------------------------------------------------------+
        | Auto (1)     | The measurement computes the minimum quiet time used for triggering.                        |
        +--------------+---------------------------------------------------------------------------------------------+

        Args:
            selector_string (string):
                Pass an empty string.

            value (enums.TriggerMinimumQuietTimeMode, int):
                Specifies whether the measurement computes the minimum quiet time used for triggering.

        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
            )
            value = value.value if type(value) is enums.TriggerMinimumQuietTimeMode else value
            error_code = self._interpreter.set_attribute_i32(  # type: ignore
                updated_selector_string,
                attributes.AttributeID.TRIGGER_MINIMUM_QUIET_TIME_MODE.value,
                value,
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def get_trigger_minimum_quiet_time_duration(self, selector_string):
        r"""Gets the time duration for which the signal must be quiet before the signal analyzer arms the I/Q power edge
        trigger.

        This value is expressed in seconds.

        If you set the :py:attr:`~nirfmxwcdma.attributes.AttributeID.IQ_POWER_EDGE_TRIGGER_SLOPE` attribute to **Rising
        Slope**, the signal is quiet below the trigger level. If you set the IQ Power Edge Slope attribute to **Falling
        Slope**, the signal is quiet above the trigger level.

        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 of this attribute is hardware dependent.

        Args:
            selector_string (string):
                Pass an empty string.

        Returns:
            Tuple (attr_val, error_code):

            attr_val (float):
                Specifies the time duration for which the signal must be quiet before the signal analyzer arms the I/Q power edge
                trigger.

            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
            )
            attr_val, error_code = self._interpreter.get_attribute_f64(  # type: ignore
                updated_selector_string,
                attributes.AttributeID.TRIGGER_MINIMUM_QUIET_TIME_DURATION.value,
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return attr_val, error_code

    @_raise_if_disposed
    def set_trigger_minimum_quiet_time_duration(self, selector_string, value):
        r"""Sets the time duration for which the signal must be quiet before the signal analyzer arms the I/Q power edge
        trigger.

        This value is expressed in seconds.

        If you set the :py:attr:`~nirfmxwcdma.attributes.AttributeID.IQ_POWER_EDGE_TRIGGER_SLOPE` attribute to **Rising
        Slope**, the signal is quiet below the trigger level. If you set the IQ Power Edge Slope attribute to **Falling
        Slope**, the signal is quiet above the trigger level.

        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 of this attribute is hardware dependent.

        Args:
            selector_string (string):
                Pass an empty string.

            value (float):
                Specifies the time duration for which the signal must be quiet before the signal analyzer arms the I/Q power edge
                trigger.

        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
            )
            error_code = self._interpreter.set_attribute_f64(  # type: ignore
                updated_selector_string,
                attributes.AttributeID.TRIGGER_MINIMUM_QUIET_TIME_DURATION.value,
                value,
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def get_link_direction(self, selector_string):
        r"""Gets the link direction of the units under test.

        The unit under test is either the base station or the user equipment.

        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 **Uplink**.

        +--------------+----------------------------------------------------------------------+
        | Name (Value) | Description                                                          |
        +==============+======================================================================+
        | Downlink (0) | The link is from the base transceiver station to the user equipment. |
        +--------------+----------------------------------------------------------------------+
        | Uplink (1)   | The link is from the user equipment to the base transceiver station. |
        +--------------+----------------------------------------------------------------------+

        Args:
            selector_string (string):
                Pass an empty string.

        Returns:
            Tuple (attr_val, error_code):

            attr_val (enums.LinkDirection):
                Specifies the link direction of the units under test.

            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
            )
            attr_val, error_code = self._interpreter.get_attribute_i32(  # type: ignore
                updated_selector_string, attributes.AttributeID.LINK_DIRECTION.value
            )
            attr_val = enums.LinkDirection(attr_val)
        except (KeyError, ValueError):
            raise errors.DriverTooNewError()  # type: ignore
        finally:
            self._session_function_lock.exit_read_lock()

        return attr_val, error_code

    @_raise_if_disposed
    def set_link_direction(self, selector_string, value):
        r"""Sets the link direction of the units under test.

        The unit under test is either the base station or the user equipment.

        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 **Uplink**.

        +--------------+----------------------------------------------------------------------+
        | Name (Value) | Description                                                          |
        +==============+======================================================================+
        | Downlink (0) | The link is from the base transceiver station to the user equipment. |
        +--------------+----------------------------------------------------------------------+
        | Uplink (1)   | The link is from the user equipment to the base transceiver station. |
        +--------------+----------------------------------------------------------------------+

        Args:
            selector_string (string):
                Pass an empty string.

            value (enums.LinkDirection, int):
                Specifies the link direction of the units under test.

        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
            )
            value = value.value if type(value) is enums.LinkDirection else value
            error_code = self._interpreter.set_attribute_i32(  # type: ignore
                updated_selector_string, attributes.AttributeID.LINK_DIRECTION.value, value
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def get_band(self, selector_string):
        r"""Gets the Universal Mobile Telecommunications System (UMTS) operation band.

        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 **1**.

        Args:
            selector_string (string):
                Pass an empty string.

        Returns:
            Tuple (attr_val, error_code):

            attr_val (int):
                Specifies the Universal Mobile Telecommunications System (UMTS) operation band.

            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
            )
            attr_val, error_code = self._interpreter.get_attribute_i32(  # type: ignore
                updated_selector_string, attributes.AttributeID.BAND.value
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return attr_val, error_code

    @_raise_if_disposed
    def set_band(self, selector_string, value):
        r"""Sets the Universal Mobile Telecommunications System (UMTS) operation band.

        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 **1**.

        Args:
            selector_string (string):
                Pass an empty string.

            value (int):
                Specifies the Universal Mobile Telecommunications System (UMTS) operation band.

        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
            )
            error_code = self._interpreter.set_attribute_i32(  # type: ignore
                updated_selector_string, attributes.AttributeID.BAND.value, value
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def get_number_of_carriers(self, selector_string):
        r"""Gets the number of carriers.

        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 1.

        Args:
            selector_string (string):
                Pass an empty string.

        Returns:
            Tuple (attr_val, error_code):

            attr_val (int):
                Specifies the number of carriers.

            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
            )
            attr_val, error_code = self._interpreter.get_attribute_i32(  # type: ignore
                updated_selector_string, attributes.AttributeID.NUMBER_OF_CARRIERS.value
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return attr_val, error_code

    @_raise_if_disposed
    def set_number_of_carriers(self, selector_string, value):
        r"""Sets the number of carriers.

        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 1.

        Args:
            selector_string (string):
                Pass an empty string.

            value (int):
                Specifies the number of carriers.

        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
            )
            error_code = self._interpreter.set_attribute_i32(  # type: ignore
                updated_selector_string, attributes.AttributeID.NUMBER_OF_CARRIERS.value, value
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def get_carrier_frequency(self, selector_string):
        r"""Gets the center frequency of the carrier, relative to the RF
        :py:attr:`~nirfmxwcdma.attributes.AttributeID.CENTER_FREQUENCY`.

        This value is expressed in Hz.

        Use "carrier<*k*>" as the selector string to configure or read this attribute.

        The default value is 0.

        Args:
            selector_string (string):
                Pass an empty string.

        Returns:
            Tuple (attr_val, error_code):

            attr_val (float):
                Specifies the center frequency of the carrier, relative to the RF
                :py:attr:`~nirfmxwcdma.attributes.AttributeID.CENTER_FREQUENCY`.

            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
            )
            attr_val, error_code = self._interpreter.get_attribute_f64(  # type: ignore
                updated_selector_string, attributes.AttributeID.CARRIER_FREQUENCY.value
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return attr_val, error_code

    @_raise_if_disposed
    def set_carrier_frequency(self, selector_string, value):
        r"""Sets the center frequency of the carrier, relative to the RF
        :py:attr:`~nirfmxwcdma.attributes.AttributeID.CENTER_FREQUENCY`.

        This value is expressed in Hz.

        Use "carrier<*k*>" as the selector string to configure or read this attribute.

        The default value is 0.

        Args:
            selector_string (string):
                Pass an empty string.

            value (float):
                Specifies the center frequency of the carrier, relative to the RF
                :py:attr:`~nirfmxwcdma.attributes.AttributeID.CENTER_FREQUENCY`.

        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
            )
            error_code = self._interpreter.set_attribute_f64(  # type: ignore
                updated_selector_string, attributes.AttributeID.CARRIER_FREQUENCY.value, value
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def get_channel_configuration_mode(self, selector_string):
        r"""Gets the channel configuration mode.

        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 **Auto Detect**.

        +------------------+--------------------------------------------------------------------------------------------------------------------------+
        | Name (Value)     | Description                                                                                                              |
        +==================+==========================================================================================================================+
        | Auto Detect (0)  | The measurement detects the channels.                                                                                    |
        +------------------+--------------------------------------------------------------------------------------------------------------------------+
        | User Defined (1) | Configure the channels using the Num Channels attribute and the RFmxWCDMA Configure User Defined Channel (Array)         |
        |                  | method.                                                                                                                  |
        +------------------+--------------------------------------------------------------------------------------------------------------------------+
        | Test Model (2)   | Choose from the standard-defined channel configurations using the UL Test Model attribute.                               |
        +------------------+--------------------------------------------------------------------------------------------------------------------------+

        Args:
            selector_string (string):
                Pass an empty string.

        Returns:
            Tuple (attr_val, error_code):

            attr_val (enums.ChannelConfigurationMode):
                Specifies the channel configuration mode.

            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
            )
            attr_val, error_code = self._interpreter.get_attribute_i32(  # type: ignore
                updated_selector_string, attributes.AttributeID.CHANNEL_CONFIGURATION_MODE.value
            )
            attr_val = enums.ChannelConfigurationMode(attr_val)
        except (KeyError, ValueError):
            raise errors.DriverTooNewError()  # type: ignore
        finally:
            self._session_function_lock.exit_read_lock()

        return attr_val, error_code

    @_raise_if_disposed
    def set_channel_configuration_mode(self, selector_string, value):
        r"""Sets the channel configuration mode.

        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 **Auto Detect**.

        +------------------+--------------------------------------------------------------------------------------------------------------------------+
        | Name (Value)     | Description                                                                                                              |
        +==================+==========================================================================================================================+
        | Auto Detect (0)  | The measurement detects the channels.                                                                                    |
        +------------------+--------------------------------------------------------------------------------------------------------------------------+
        | User Defined (1) | Configure the channels using the Num Channels attribute and the RFmxWCDMA Configure User Defined Channel (Array)         |
        |                  | method.                                                                                                                  |
        +------------------+--------------------------------------------------------------------------------------------------------------------------+
        | Test Model (2)   | Choose from the standard-defined channel configurations using the UL Test Model attribute.                               |
        +------------------+--------------------------------------------------------------------------------------------------------------------------+

        Args:
            selector_string (string):
                Pass an empty string.

            value (enums.ChannelConfigurationMode, int):
                Specifies the channel configuration mode.

        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
            )
            value = value.value if type(value) is enums.ChannelConfigurationMode else value
            error_code = self._interpreter.set_attribute_i32(  # type: ignore
                updated_selector_string,
                attributes.AttributeID.CHANNEL_CONFIGURATION_MODE.value,
                value,
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def get_number_of_channels(self, selector_string):
        r"""Gets the number of user-defined channels.

        Use "carrier<*n*>" as the selector string to configure read this attribute.

        The default value is 0.

        Args:
            selector_string (string):
                Pass an empty string.

        Returns:
            Tuple (attr_val, error_code):

            attr_val (int):
                Specifies the number of user-defined channels.

            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
            )
            attr_val, error_code = self._interpreter.get_attribute_i32(  # type: ignore
                updated_selector_string, attributes.AttributeID.NUMBER_OF_CHANNELS.value
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return attr_val, error_code

    @_raise_if_disposed
    def set_number_of_channels(self, selector_string, value):
        r"""Sets the number of user-defined channels.

        Use "carrier<*n*>" as the selector string to configure read this attribute.

        The default value is 0.

        Args:
            selector_string (string):
                Pass an empty string.

            value (int):
                Specifies the number of user-defined channels.

        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
            )
            error_code = self._interpreter.set_attribute_i32(  # type: ignore
                updated_selector_string, attributes.AttributeID.NUMBER_OF_CHANNELS.value, value
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def get_spreading_factor(self, selector_string):
        r"""Gets the spreading factor of the channel.

        Use "carrier<*n*>/channel<*k*>" as the selector string to configure or read this attribute.

        The default value is 256. Valid values are 2, 4, 8,16, 32, 64, 128, and 256.

        Args:
            selector_string (string):
                Pass an empty string.

        Returns:
            Tuple (attr_val, error_code):

            attr_val (int):
                Specifies the spreading factor of the channel.

            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
            )
            attr_val, error_code = self._interpreter.get_attribute_i32(  # type: ignore
                updated_selector_string, attributes.AttributeID.SPREADING_FACTOR.value
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return attr_val, error_code

    @_raise_if_disposed
    def set_spreading_factor(self, selector_string, value):
        r"""Sets the spreading factor of the channel.

        Use "carrier<*n*>/channel<*k*>" as the selector string to configure or read this attribute.

        The default value is 256. Valid values are 2, 4, 8,16, 32, 64, 128, and 256.

        Args:
            selector_string (string):
                Pass an empty string.

            value (int):
                Specifies the spreading factor of the channel.

        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
            )
            error_code = self._interpreter.set_attribute_i32(  # type: ignore
                updated_selector_string, attributes.AttributeID.SPREADING_FACTOR.value, value
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def get_spreading_code(self, selector_string):
        r"""Gets the spreading code of the channel.

        Use "carrier<*n*>/channel<*k*>" as the selector string to configure or read this attribute.

        The default value is 0. Valid values are 0 to (*Spreading factor* - 1).

        Args:
            selector_string (string):
                Pass an empty string.

        Returns:
            Tuple (attr_val, error_code):

            attr_val (int):
                Specifies the spreading code of the channel.

            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
            )
            attr_val, error_code = self._interpreter.get_attribute_i32(  # type: ignore
                updated_selector_string, attributes.AttributeID.SPREADING_CODE.value
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return attr_val, error_code

    @_raise_if_disposed
    def set_spreading_code(self, selector_string, value):
        r"""Sets the spreading code of the channel.

        Use "carrier<*n*>/channel<*k*>" as the selector string to configure or read this attribute.

        The default value is 0. Valid values are 0 to (*Spreading factor* - 1).

        Args:
            selector_string (string):
                Pass an empty string.

            value (int):
                Specifies the spreading code of the channel.

        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
            )
            error_code = self._interpreter.set_attribute_i32(  # type: ignore
                updated_selector_string, attributes.AttributeID.SPREADING_CODE.value, value
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def get_modulation_type(self, selector_string):
        r"""Gets the modulation type for the channel.

        Use "carrier<*n*>/channel<*k*>" as the selector string to configure or read this attribute.

        The default value is **BPSK/QPSK**.

        +----------------+--------------------------------+
        | Name (Value)   | Description                    |
        +================+================================+
        | BPSK/QPSK (0)  | The modulation type is BPSK.   |
        +----------------+--------------------------------+
        | 4PAM/16QAM (1) | The modulation type is 4-PAM.  |
        +----------------+--------------------------------+
        | 64QAM (2)      | The modulation type is 64-QAM. |
        +----------------+--------------------------------+

        Args:
            selector_string (string):
                Pass an empty string.

        Returns:
            Tuple (attr_val, error_code):

            attr_val (enums.ModulationType):
                Specifies the modulation type for the channel.

            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
            )
            attr_val, error_code = self._interpreter.get_attribute_i32(  # type: ignore
                updated_selector_string, attributes.AttributeID.MODULATION_TYPE.value
            )
            attr_val = enums.ModulationType(attr_val)
        except (KeyError, ValueError):
            raise errors.DriverTooNewError()  # type: ignore
        finally:
            self._session_function_lock.exit_read_lock()

        return attr_val, error_code

    @_raise_if_disposed
    def set_modulation_type(self, selector_string, value):
        r"""Sets the modulation type for the channel.

        Use "carrier<*n*>/channel<*k*>" as the selector string to configure or read this attribute.

        The default value is **BPSK/QPSK**.

        +----------------+--------------------------------+
        | Name (Value)   | Description                    |
        +================+================================+
        | BPSK/QPSK (0)  | The modulation type is BPSK.   |
        +----------------+--------------------------------+
        | 4PAM/16QAM (1) | The modulation type is 4-PAM.  |
        +----------------+--------------------------------+
        | 64QAM (2)      | The modulation type is 64-QAM. |
        +----------------+--------------------------------+

        Args:
            selector_string (string):
                Pass an empty string.

            value (enums.ModulationType, int):
                Specifies the modulation type for the channel.

        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
            )
            value = value.value if type(value) is enums.ModulationType else value
            error_code = self._interpreter.set_attribute_i32(  # type: ignore
                updated_selector_string, attributes.AttributeID.MODULATION_TYPE.value, value
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def get_branch(self, selector_string):
        r"""Gets the branch on which the data is modulated in the channel.

        Use "carrier<*n*>/channel<*k*>" as the selector string to configure or read this attribute.

        The default value is **I**.

        +--------------+---------------------------------------------------------+
        | Name (Value) | Description                                             |
        +==============+=========================================================+
        | I (0)        | The signal is modulated in the in-phase branch.         |
        +--------------+---------------------------------------------------------+
        | Q (1)        | The signal is modulated in the quadrature-phase branch. |
        +--------------+---------------------------------------------------------+
        | I and Q (2)  | The signal is complex modulated.                        |
        +--------------+---------------------------------------------------------+

        Args:
            selector_string (string):
                Pass an empty string.

        Returns:
            Tuple (attr_val, error_code):

            attr_val (enums.Branch):
                Specifies the branch on which the data is modulated in the channel.

            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
            )
            attr_val, error_code = self._interpreter.get_attribute_i32(  # type: ignore
                updated_selector_string, attributes.AttributeID.BRANCH.value
            )
            attr_val = enums.Branch(attr_val)
        except (KeyError, ValueError):
            raise errors.DriverTooNewError()  # type: ignore
        finally:
            self._session_function_lock.exit_read_lock()

        return attr_val, error_code

    @_raise_if_disposed
    def set_branch(self, selector_string, value):
        r"""Sets the branch on which the data is modulated in the channel.

        Use "carrier<*n*>/channel<*k*>" as the selector string to configure or read this attribute.

        The default value is **I**.

        +--------------+---------------------------------------------------------+
        | Name (Value) | Description                                             |
        +==============+=========================================================+
        | I (0)        | The signal is modulated in the in-phase branch.         |
        +--------------+---------------------------------------------------------+
        | Q (1)        | The signal is modulated in the quadrature-phase branch. |
        +--------------+---------------------------------------------------------+
        | I and Q (2)  | The signal is complex modulated.                        |
        +--------------+---------------------------------------------------------+

        Args:
            selector_string (string):
                Pass an empty string.

            value (enums.Branch, int):
                Specifies the branch on which the data is modulated in the channel.

        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
            )
            value = value.value if type(value) is enums.Branch else value
            error_code = self._interpreter.set_attribute_i32(  # type: ignore
                updated_selector_string, attributes.AttributeID.BRANCH.value, value
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def get_uplink_test_model(self, selector_string):
        r"""Gets the uplink test model when the user sets the
        :py:attr:`~nirfmxwcdma.attributes.AttributeID.CHANNEL_CONFIGURATION_MODE` attribute to **Test Model**.

        Each test model is a set of channel configurations defined by the standard.

        Each uplink test model is a set of channel configurations as defined by the reference measurement channels in
        tables C.2.1, C.2.2, C.2.3, C.2.4, C.2.5, C.10.1.4, C.11.1.3, or C.11.1.4  of the *3GPP TS 34.121-1* specification.
        Released specifications from version 6.3.0, release 6 to version 11.5.0, release 11 are supported. Reference
        measurement channels in multiple releases of the specification can be the same. Each uplink test model name starts with
        R<*n*>, where *n* is the oldest release number with a given set of channel configurations.

        Use "carrier<*n*>" as the selector string to configure or read this attribute.

        The default value is **R6 C.2.1**.

        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | Name (Value)              | Description                                                                                                              |
        +===========================+==========================================================================================================================+
        | R6 C.2.1 (0)              | The UL R6 C.2.1 configuration (12.2 kbps) is as defined in Annex C, section C.2.1 of the *3GPP TS 34.121*                |
        |                           | specification, version 6.3.0, release 6.                                                                                 |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R6 C.2.2 (1)              | The UL R6 C.2.2 configuration (64 kbps) is as defined in Annex C, section C.2.2 of the *3GPP TS 34.121* specification,   |
        |                           | version 6.3.0, release 6.                                                                                                |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R6 C.2.3 (2)              | The UL R6 C.2.3 configuration (144 kbps) is as defined in Annex C, section C.2.3 of the *3GPP TS 34.121* specification,  |
        |                           | version 6.3.0, release 6.                                                                                                |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R6 C.2.4 (3)              | The UL R6 C.2.4 configuration (384 kbps) is as defined in Annex C, section C.2.4 of the *3GPP TS 34.121* specification,  |
        |                           | version 6.3.0, release 6.                                                                                                |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R6 C.2.5 (4)              | The UL R6 C.2.5 configuration (768 kbps) is as defined in Annex C, section C.2.5 of the *3GPP TS 34.121* specification,  |
        |                           | version 6.3.0, release 6.                                                                                                |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R6 C.10.1.4 Subtest1 (5)  | The UL R6 C.10.1.4 Subtest1 is as defined in Annex C, table C.10.1.4 Sub-Test 1 of the *3GPP TS 34.121* specification,   |
        |                           | release 6.                                                                                                               |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R6 C.10.1.4 Subtest2 (6)  | The UL R6 C.10.1.4 Subtest2 is as defined in Annex C, table C.10.1.4 Sub-Test 2 of the *3GPP TS 34.121* specification,   |
        |                           | release 6.                                                                                                               |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R6 C.10.1.4 Subtest3 (7)  | The UL R6 C.10.1.4 Subtest3 is as defined in Annex C, table C.10.1.4 Sub-Test 3 of the *3GPP TS 34.121* specification,   |
        |                           | release 6.                                                                                                               |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R6 C.10.1.4 Subtest4 (8)  | The UL R6 C.10.1.4 Subtest4 is as defined in Annex C, table C.10.1.4 Sub-Test 4 of the *3GPP TS 34.121* specification,   |
        |                           | release 6.                                                                                                               |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R6 C.10.1.4 Subtest5 (9)  | The UL R6 C.10.1.4 Subtest5 is as defined in Annex C, table C.10.1.4 Sub-Test 5 of the *3GPP TS 34.121* specification,   |
        |                           | release 6.                                                                                                               |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R6 C.10.1.4 Subtest6 (10) | The UL R6 C.10.1.4 Subtest6 is as defined in Annex C, table C.10.1.4 Sub-Test 6 of the *3GPP TS 34.121* specification,   |
        |                           | release 6.                                                                                                               |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R7 C.10.1.4 Subtest1 (11) | The UL R7 C.10.1.4 Subtest1 is as defined in Annex C, table C.10.1.4 Sub-Test 1 of the *3GPP TS 34.121-1*                |
        |                           | specification, release 7.                                                                                                |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R7 C.10.1.4 Subtest2 (12) | The UL R7 C.10.1.4 Subtest2 is as defined in Annex C, table C.10.1.4 Sub-Test 2 of the *3GPP TS 34.121-1*                |
        |                           | specification, release 7.                                                                                                |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R7 C.10.1.4 Subtest3 (13) | The UL R7 C.10.1.4 Subtest3 is as defined in Annex C, table C.10.1.4 Sub-Test 3 of the *3GPP TS 34.121-1*                |
        |                           | specification, release 7.                                                                                                |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R7 C.10.1.4 Subtest4 (14) | The UL R7 C.10.1.4 Subtest4 is as defined in Annex C, table C.10.1.4 Sub-Test 4 of the *3GPP TS 34.121-1*                |
        |                           | specification, release 7.                                                                                                |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R7 C.11.1.3 Subtest1 (15) | The UL R7 C.11.1.3 Subtest1 is as defined in Annex C, table C.11.1.3 Sub-Test 1 of the *3GPP TS 34.121-1*                |
        |                           | specification, release 7.                                                                                                |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R7 C.11.1.3 Subtest2 (16) | The UL R7 C.11.1.3 Subtest2 is as defined in Annex C, table C.11.1.3 Sub-Test 2 of the *3GPP TS 34.121-1*                |
        |                           | specification, release 7.                                                                                                |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R7 C.11.1.3 Subtest3 (17) | The UL R7 C.11.1.3 Subtest3 is as defined in Annex C, table C.11.1.3 Sub-Test 3 of the *3GPP TS 34.121-1*                |
        |                           | specification, release 7.                                                                                                |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R7 C.11.1.3 Subtest4 (18) | The UL R7 C.11.1.3 Subtest4 is as defined in Annex C, table C.11.1.3 Sub-Test 4 of the *3GPP TS 34.121-1*                |
        |                           | specification, release 7.                                                                                                |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R7 C.11.1.3 Subtest5 (19) | The UL R7 C.11.1.3 Subtest5 is as defined in Annex C, table C.11.1.3 Sub-Test 5 of the *3GPP TS 34.121-1*                |
        |                           | specification, release 7.                                                                                                |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R8 C.11.1.3 Subtest1 (20) | The UL R8 C.11.1.3 Subtest1 is as defined in Annex C, table C.11.1.3 Sub-Test 1 of the *3GPP TS 34.121-1*                |
        |                           | specification, release 8.                                                                                                |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R8 C.11.1.3 Subtest2 (21) | The UL R8 C.11.1.3 Subtest2 is as defined in Annex C, table C.11.1.3 Sub-Test 2 of the *3GPP TS 34.121-1*                |
        |                           | specification, release 8.                                                                                                |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R8 C.11.1.3 Subtest3 (22) | The UL R8 C.11.1.3 Subtest3 is as defined in Annex C, table C.11.1.3 Sub-Test 3 of the *3GPP TS 34.121-1*                |
        |                           | specification, release 8.                                                                                                |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R8 C.11.1.3 Subtest4 (23) | The UL R8 C.11.1.3 Subtest4 is as defined in Annex C, table C.11.1.3 Sub-Test 4 of the *3GPP TS 34.121-1*                |
        |                           | specification, release 8.                                                                                                |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R8 C.11.1.3 Subtest5 (24) | The UL R8 C.11.1.3 Subtest5 is as defined in Annex C, table C.11.1.3 Sub-Test 5 of the *3GPP TS 34.121-1*                |
        |                           | specification, release 8.                                                                                                |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R8 C.11.1.4 Subtest1 (25) | The UL R8 C.11.1.4 Subtest1 is as defined in Annex C, table C.11.1.4 Sub-Test 1 of the *3GPP TS 34.121-1*                |
        |                           | specification, release 8.                                                                                                |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+

        Args:
            selector_string (string):
                Pass an empty string.

        Returns:
            Tuple (attr_val, error_code):

            attr_val (enums.UplinkTestModel):
                Specifies the uplink test model when the user sets the
                :py:attr:`~nirfmxwcdma.attributes.AttributeID.CHANNEL_CONFIGURATION_MODE` attribute to **Test Model**.

            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
            )
            attr_val, error_code = self._interpreter.get_attribute_i32(  # type: ignore
                updated_selector_string, attributes.AttributeID.UPLINK_TEST_MODEL.value
            )
            attr_val = enums.UplinkTestModel(attr_val)
        except (KeyError, ValueError):
            raise errors.DriverTooNewError()  # type: ignore
        finally:
            self._session_function_lock.exit_read_lock()

        return attr_val, error_code

    @_raise_if_disposed
    def set_uplink_test_model(self, selector_string, value):
        r"""Sets the uplink test model when the user sets the
        :py:attr:`~nirfmxwcdma.attributes.AttributeID.CHANNEL_CONFIGURATION_MODE` attribute to **Test Model**.

        Each test model is a set of channel configurations defined by the standard.

        Each uplink test model is a set of channel configurations as defined by the reference measurement channels in
        tables C.2.1, C.2.2, C.2.3, C.2.4, C.2.5, C.10.1.4, C.11.1.3, or C.11.1.4  of the *3GPP TS 34.121-1* specification.
        Released specifications from version 6.3.0, release 6 to version 11.5.0, release 11 are supported. Reference
        measurement channels in multiple releases of the specification can be the same. Each uplink test model name starts with
        R<*n*>, where *n* is the oldest release number with a given set of channel configurations.

        Use "carrier<*n*>" as the selector string to configure or read this attribute.

        The default value is **R6 C.2.1**.

        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | Name (Value)              | Description                                                                                                              |
        +===========================+==========================================================================================================================+
        | R6 C.2.1 (0)              | The UL R6 C.2.1 configuration (12.2 kbps) is as defined in Annex C, section C.2.1 of the *3GPP TS 34.121*                |
        |                           | specification, version 6.3.0, release 6.                                                                                 |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R6 C.2.2 (1)              | The UL R6 C.2.2 configuration (64 kbps) is as defined in Annex C, section C.2.2 of the *3GPP TS 34.121* specification,   |
        |                           | version 6.3.0, release 6.                                                                                                |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R6 C.2.3 (2)              | The UL R6 C.2.3 configuration (144 kbps) is as defined in Annex C, section C.2.3 of the *3GPP TS 34.121* specification,  |
        |                           | version 6.3.0, release 6.                                                                                                |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R6 C.2.4 (3)              | The UL R6 C.2.4 configuration (384 kbps) is as defined in Annex C, section C.2.4 of the *3GPP TS 34.121* specification,  |
        |                           | version 6.3.0, release 6.                                                                                                |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R6 C.2.5 (4)              | The UL R6 C.2.5 configuration (768 kbps) is as defined in Annex C, section C.2.5 of the *3GPP TS 34.121* specification,  |
        |                           | version 6.3.0, release 6.                                                                                                |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R6 C.10.1.4 Subtest1 (5)  | The UL R6 C.10.1.4 Subtest1 is as defined in Annex C, table C.10.1.4 Sub-Test 1 of the *3GPP TS 34.121* specification,   |
        |                           | release 6.                                                                                                               |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R6 C.10.1.4 Subtest2 (6)  | The UL R6 C.10.1.4 Subtest2 is as defined in Annex C, table C.10.1.4 Sub-Test 2 of the *3GPP TS 34.121* specification,   |
        |                           | release 6.                                                                                                               |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R6 C.10.1.4 Subtest3 (7)  | The UL R6 C.10.1.4 Subtest3 is as defined in Annex C, table C.10.1.4 Sub-Test 3 of the *3GPP TS 34.121* specification,   |
        |                           | release 6.                                                                                                               |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R6 C.10.1.4 Subtest4 (8)  | The UL R6 C.10.1.4 Subtest4 is as defined in Annex C, table C.10.1.4 Sub-Test 4 of the *3GPP TS 34.121* specification,   |
        |                           | release 6.                                                                                                               |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R6 C.10.1.4 Subtest5 (9)  | The UL R6 C.10.1.4 Subtest5 is as defined in Annex C, table C.10.1.4 Sub-Test 5 of the *3GPP TS 34.121* specification,   |
        |                           | release 6.                                                                                                               |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R6 C.10.1.4 Subtest6 (10) | The UL R6 C.10.1.4 Subtest6 is as defined in Annex C, table C.10.1.4 Sub-Test 6 of the *3GPP TS 34.121* specification,   |
        |                           | release 6.                                                                                                               |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R7 C.10.1.4 Subtest1 (11) | The UL R7 C.10.1.4 Subtest1 is as defined in Annex C, table C.10.1.4 Sub-Test 1 of the *3GPP TS 34.121-1*                |
        |                           | specification, release 7.                                                                                                |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R7 C.10.1.4 Subtest2 (12) | The UL R7 C.10.1.4 Subtest2 is as defined in Annex C, table C.10.1.4 Sub-Test 2 of the *3GPP TS 34.121-1*                |
        |                           | specification, release 7.                                                                                                |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R7 C.10.1.4 Subtest3 (13) | The UL R7 C.10.1.4 Subtest3 is as defined in Annex C, table C.10.1.4 Sub-Test 3 of the *3GPP TS 34.121-1*                |
        |                           | specification, release 7.                                                                                                |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R7 C.10.1.4 Subtest4 (14) | The UL R7 C.10.1.4 Subtest4 is as defined in Annex C, table C.10.1.4 Sub-Test 4 of the *3GPP TS 34.121-1*                |
        |                           | specification, release 7.                                                                                                |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R7 C.11.1.3 Subtest1 (15) | The UL R7 C.11.1.3 Subtest1 is as defined in Annex C, table C.11.1.3 Sub-Test 1 of the *3GPP TS 34.121-1*                |
        |                           | specification, release 7.                                                                                                |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R7 C.11.1.3 Subtest2 (16) | The UL R7 C.11.1.3 Subtest2 is as defined in Annex C, table C.11.1.3 Sub-Test 2 of the *3GPP TS 34.121-1*                |
        |                           | specification, release 7.                                                                                                |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R7 C.11.1.3 Subtest3 (17) | The UL R7 C.11.1.3 Subtest3 is as defined in Annex C, table C.11.1.3 Sub-Test 3 of the *3GPP TS 34.121-1*                |
        |                           | specification, release 7.                                                                                                |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R7 C.11.1.3 Subtest4 (18) | The UL R7 C.11.1.3 Subtest4 is as defined in Annex C, table C.11.1.3 Sub-Test 4 of the *3GPP TS 34.121-1*                |
        |                           | specification, release 7.                                                                                                |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R7 C.11.1.3 Subtest5 (19) | The UL R7 C.11.1.3 Subtest5 is as defined in Annex C, table C.11.1.3 Sub-Test 5 of the *3GPP TS 34.121-1*                |
        |                           | specification, release 7.                                                                                                |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R8 C.11.1.3 Subtest1 (20) | The UL R8 C.11.1.3 Subtest1 is as defined in Annex C, table C.11.1.3 Sub-Test 1 of the *3GPP TS 34.121-1*                |
        |                           | specification, release 8.                                                                                                |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R8 C.11.1.3 Subtest2 (21) | The UL R8 C.11.1.3 Subtest2 is as defined in Annex C, table C.11.1.3 Sub-Test 2 of the *3GPP TS 34.121-1*                |
        |                           | specification, release 8.                                                                                                |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R8 C.11.1.3 Subtest3 (22) | The UL R8 C.11.1.3 Subtest3 is as defined in Annex C, table C.11.1.3 Sub-Test 3 of the *3GPP TS 34.121-1*                |
        |                           | specification, release 8.                                                                                                |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R8 C.11.1.3 Subtest4 (23) | The UL R8 C.11.1.3 Subtest4 is as defined in Annex C, table C.11.1.3 Sub-Test 4 of the *3GPP TS 34.121-1*                |
        |                           | specification, release 8.                                                                                                |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R8 C.11.1.3 Subtest5 (24) | The UL R8 C.11.1.3 Subtest5 is as defined in Annex C, table C.11.1.3 Sub-Test 5 of the *3GPP TS 34.121-1*                |
        |                           | specification, release 8.                                                                                                |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | R8 C.11.1.4 Subtest1 (25) | The UL R8 C.11.1.4 Subtest1 is as defined in Annex C, table C.11.1.4 Sub-Test 1 of the *3GPP TS 34.121-1*                |
        |                           | specification, release 8.                                                                                                |
        +---------------------------+--------------------------------------------------------------------------------------------------------------------------+

        Args:
            selector_string (string):
                Pass an empty string.

            value (enums.UplinkTestModel, int):
                Specifies the uplink test model when the user sets the
                :py:attr:`~nirfmxwcdma.attributes.AttributeID.CHANNEL_CONFIGURATION_MODE` attribute to **Test Model**.

        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
            )
            value = value.value if type(value) is enums.UplinkTestModel else value
            error_code = self._interpreter.set_attribute_i32(  # type: ignore
                updated_selector_string, attributes.AttributeID.UPLINK_TEST_MODEL.value, value
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def get_downlink_test_model(self, selector_string):
        r"""Gets the symbol boundary synchronization method.

        Use "carrier<*n*>" as the selector string to configure or read this attribute.

        +-------------------------------------------------+----------------------------------------------------------------------------+
        | Name (Value)                                    | Description                                                                |
        +=================================================+============================================================================+
        | Test Model 1 - 16 DPCH (0)                      | Test Model 1 with 16 DPCH is used for synchronization.                     |
        +-------------------------------------------------+----------------------------------------------------------------------------+
        | Test Model 1 - 32 DPCH (1)                      | Test Model 1 with 32 DPCH is used for synchronization.                     |
        +-------------------------------------------------+----------------------------------------------------------------------------+
        | Test Model 1 - 64 DPCH (2)                      | Test Mode 1 with 64 DPCH is used for synchronization.                      |
        +-------------------------------------------------+----------------------------------------------------------------------------+
        | Test Model 1 - 16 DPCH/S-CCPCH (3)              | Test Model 1 with 16 DPCH and S-CCPCH is used for synchronization.         |
        +-------------------------------------------------+----------------------------------------------------------------------------+
        | Test Model 1 - 32 DPCH/S-CCPCH (4)              | Test Model 1 with 32 DPCH and S-CCPCH is used for synchronization.         |
        +-------------------------------------------------+----------------------------------------------------------------------------+
        | Test Model 1 - 64 DPCH/S-CCPCH (5)              | Test Model 1 with 64 DPCH and S-CCPCH is used for synchronization.         |
        +-------------------------------------------------+----------------------------------------------------------------------------+
        | Test Model 2 (6)                                | Test Model 2 is used for synchronization.                                  |
        +-------------------------------------------------+----------------------------------------------------------------------------+
        | Test Model 2 - S-CCPCH (7)                      | Test Model 2 with a S-CCPCH is used for synchronization.                   |
        +-------------------------------------------------+----------------------------------------------------------------------------+
        | Test Model 3 - 16 DPCH (8)                      | Test Mode 3 with 16 DPCH is used for synchronization.                      |
        +-------------------------------------------------+----------------------------------------------------------------------------+
        | Test Model 3 - 32 DPCH (9)                      | Test Mode 3 with 32 DPCH is used for synchronization.                      |
        +-------------------------------------------------+----------------------------------------------------------------------------+
        | Test Model 3 - 16 DPCH/S-CCPCH (10)             | Test Model 3 with 16 DPCH/S-CCPCH is used for synchronization.             |
        +-------------------------------------------------+----------------------------------------------------------------------------+
        | Test Model 3 - 32 DPCH/S-CCPCH (11)             | Test Model 3 with 16 DPCH/S-CCPCH is used for synchronization.             |
        +-------------------------------------------------+----------------------------------------------------------------------------+
        | Test Model 4 (12)                               | Test Model 4 is used for synchronization.                                  |
        +-------------------------------------------------+----------------------------------------------------------------------------+
        | Test Model 4 - P-CPICH (13)                     | Test Model 4 with P-CPICH is used for synchronization.                     |
        +-------------------------------------------------+----------------------------------------------------------------------------+
        | Test Model 5 - 2 HS-PDSCH [16QAM] (14)          | Test Model 5 with 2 HS-PDSCH [16QAM] is used for synchronization.          |
        +-------------------------------------------------+----------------------------------------------------------------------------+
        | Test Model 5 - 4 HS-PDSCH / 4DPCH [16QAM] (15)  | Test Model 5 with 4 HS-PDSCH / 4DPCH [16QAM] is used for synchronization.  |
        +-------------------------------------------------+----------------------------------------------------------------------------+
        | Test Model 5 - 4 HS-PDSCH / 14DPCH [16QAM] (16) | Test Model 5 with 4 HS-PDSCH / 14DPCH [16QAM] is used for synchronization. |
        +-------------------------------------------------+----------------------------------------------------------------------------+
        | Test Model 5 - 8 HS-PDSCH [16QAM] (17)          | Test Model 5 with 8 HS-PDSCH [16QAM] is used for synchronization.          |
        +-------------------------------------------------+----------------------------------------------------------------------------+
        | Test Model 6 - 4 HS-PDSCH [64QAM] (18)          | Test Model 6 with 4 HS-PDSCH [64QAM] is used for synchronization.          |
        +-------------------------------------------------+----------------------------------------------------------------------------+
        | Test Model 6 - 8 HS-PDSCH [64QAM] (19)          | Test Model 6 with 8 HS-PDSCH [64QAM] is used for synchronization.          |
        +-------------------------------------------------+----------------------------------------------------------------------------+

        Args:
            selector_string (string):
                Pass an empty string.

        Returns:
            Tuple (attr_val, error_code):

            attr_val (enums.DownlinkTestModel):
                Specifies the symbol boundary synchronization method.

            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
            )
            attr_val, error_code = self._interpreter.get_attribute_i32(  # type: ignore
                updated_selector_string, attributes.AttributeID.DOWNLINK_TEST_MODEL.value
            )
            attr_val = enums.DownlinkTestModel(attr_val)
        except (KeyError, ValueError):
            raise errors.DriverTooNewError()  # type: ignore
        finally:
            self._session_function_lock.exit_read_lock()

        return attr_val, error_code

    @_raise_if_disposed
    def set_downlink_test_model(self, selector_string, value):
        r"""Sets the symbol boundary synchronization method.

        Use "carrier<*n*>" as the selector string to configure or read this attribute.

        +-------------------------------------------------+----------------------------------------------------------------------------+
        | Name (Value)                                    | Description                                                                |
        +=================================================+============================================================================+
        | Test Model 1 - 16 DPCH (0)                      | Test Model 1 with 16 DPCH is used for synchronization.                     |
        +-------------------------------------------------+----------------------------------------------------------------------------+
        | Test Model 1 - 32 DPCH (1)                      | Test Model 1 with 32 DPCH is used for synchronization.                     |
        +-------------------------------------------------+----------------------------------------------------------------------------+
        | Test Model 1 - 64 DPCH (2)                      | Test Mode 1 with 64 DPCH is used for synchronization.                      |
        +-------------------------------------------------+----------------------------------------------------------------------------+
        | Test Model 1 - 16 DPCH/S-CCPCH (3)              | Test Model 1 with 16 DPCH and S-CCPCH is used for synchronization.         |
        +-------------------------------------------------+----------------------------------------------------------------------------+
        | Test Model 1 - 32 DPCH/S-CCPCH (4)              | Test Model 1 with 32 DPCH and S-CCPCH is used for synchronization.         |
        +-------------------------------------------------+----------------------------------------------------------------------------+
        | Test Model 1 - 64 DPCH/S-CCPCH (5)              | Test Model 1 with 64 DPCH and S-CCPCH is used for synchronization.         |
        +-------------------------------------------------+----------------------------------------------------------------------------+
        | Test Model 2 (6)                                | Test Model 2 is used for synchronization.                                  |
        +-------------------------------------------------+----------------------------------------------------------------------------+
        | Test Model 2 - S-CCPCH (7)                      | Test Model 2 with a S-CCPCH is used for synchronization.                   |
        +-------------------------------------------------+----------------------------------------------------------------------------+
        | Test Model 3 - 16 DPCH (8)                      | Test Mode 3 with 16 DPCH is used for synchronization.                      |
        +-------------------------------------------------+----------------------------------------------------------------------------+
        | Test Model 3 - 32 DPCH (9)                      | Test Mode 3 with 32 DPCH is used for synchronization.                      |
        +-------------------------------------------------+----------------------------------------------------------------------------+
        | Test Model 3 - 16 DPCH/S-CCPCH (10)             | Test Model 3 with 16 DPCH/S-CCPCH is used for synchronization.             |
        +-------------------------------------------------+----------------------------------------------------------------------------+
        | Test Model 3 - 32 DPCH/S-CCPCH (11)             | Test Model 3 with 16 DPCH/S-CCPCH is used for synchronization.             |
        +-------------------------------------------------+----------------------------------------------------------------------------+
        | Test Model 4 (12)                               | Test Model 4 is used for synchronization.                                  |
        +-------------------------------------------------+----------------------------------------------------------------------------+
        | Test Model 4 - P-CPICH (13)                     | Test Model 4 with P-CPICH is used for synchronization.                     |
        +-------------------------------------------------+----------------------------------------------------------------------------+
        | Test Model 5 - 2 HS-PDSCH [16QAM] (14)          | Test Model 5 with 2 HS-PDSCH [16QAM] is used for synchronization.          |
        +-------------------------------------------------+----------------------------------------------------------------------------+
        | Test Model 5 - 4 HS-PDSCH / 4DPCH [16QAM] (15)  | Test Model 5 with 4 HS-PDSCH / 4DPCH [16QAM] is used for synchronization.  |
        +-------------------------------------------------+----------------------------------------------------------------------------+
        | Test Model 5 - 4 HS-PDSCH / 14DPCH [16QAM] (16) | Test Model 5 with 4 HS-PDSCH / 14DPCH [16QAM] is used for synchronization. |
        +-------------------------------------------------+----------------------------------------------------------------------------+
        | Test Model 5 - 8 HS-PDSCH [16QAM] (17)          | Test Model 5 with 8 HS-PDSCH [16QAM] is used for synchronization.          |
        +-------------------------------------------------+----------------------------------------------------------------------------+
        | Test Model 6 - 4 HS-PDSCH [64QAM] (18)          | Test Model 6 with 4 HS-PDSCH [64QAM] is used for synchronization.          |
        +-------------------------------------------------+----------------------------------------------------------------------------+
        | Test Model 6 - 8 HS-PDSCH [64QAM] (19)          | Test Model 6 with 8 HS-PDSCH [64QAM] is used for synchronization.          |
        +-------------------------------------------------+----------------------------------------------------------------------------+

        Args:
            selector_string (string):
                Pass an empty string.

            value (enums.DownlinkTestModel, int):
                Specifies the symbol boundary synchronization method.

        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
            )
            value = value.value if type(value) is enums.DownlinkTestModel else value
            error_code = self._interpreter.set_attribute_i32(  # type: ignore
                updated_selector_string, attributes.AttributeID.DOWNLINK_TEST_MODEL.value, value
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def get_uplink_scrambling_type(self, selector_string):
        r"""Gets the type of scrambling to use for the measurement.

        Use "carrier<*n*>" as the selector string to configure or read this attribute.

        The default value is **Long**.

        +--------------+--------------------------------------------------------------------------------------------------------------------------+
        | Name (Value) | Description                                                                                                              |
        +==============+==========================================================================================================================+
        | Long (0)     | A long scrambling code as defined in section 4.3.2 of the * 3GPP TS 25.213* specification, version 11.4.0, release 11,   |
        |              | is used.                                                                                                                 |
        +--------------+--------------------------------------------------------------------------------------------------------------------------+
        | Short (1)    | A short scrambling code as defined in section 4.3.2 of the * 3GPP TS 25.213* specification, version 11.4.0, release 11,  |
        |              | is used.                                                                                                                 |
        +--------------+--------------------------------------------------------------------------------------------------------------------------+

        Args:
            selector_string (string):
                Pass an empty string.

        Returns:
            Tuple (attr_val, error_code):

            attr_val (enums.UplinkScramblingType):
                Specifies the type of scrambling to use for the 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
            )
            attr_val, error_code = self._interpreter.get_attribute_i32(  # type: ignore
                updated_selector_string, attributes.AttributeID.UPLINK_SCRAMBLING_TYPE.value
            )
            attr_val = enums.UplinkScramblingType(attr_val)
        except (KeyError, ValueError):
            raise errors.DriverTooNewError()  # type: ignore
        finally:
            self._session_function_lock.exit_read_lock()

        return attr_val, error_code

    @_raise_if_disposed
    def set_uplink_scrambling_type(self, selector_string, value):
        r"""Sets the type of scrambling to use for the measurement.

        Use "carrier<*n*>" as the selector string to configure or read this attribute.

        The default value is **Long**.

        +--------------+--------------------------------------------------------------------------------------------------------------------------+
        | Name (Value) | Description                                                                                                              |
        +==============+==========================================================================================================================+
        | Long (0)     | A long scrambling code as defined in section 4.3.2 of the * 3GPP TS 25.213* specification, version 11.4.0, release 11,   |
        |              | is used.                                                                                                                 |
        +--------------+--------------------------------------------------------------------------------------------------------------------------+
        | Short (1)    | A short scrambling code as defined in section 4.3.2 of the * 3GPP TS 25.213* specification, version 11.4.0, release 11,  |
        |              | is used.                                                                                                                 |
        +--------------+--------------------------------------------------------------------------------------------------------------------------+

        Args:
            selector_string (string):
                Pass an empty string.

            value (enums.UplinkScramblingType, int):
                Specifies the type of scrambling to use for the 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
            )
            value = value.value if type(value) is enums.UplinkScramblingType else value
            error_code = self._interpreter.set_attribute_i32(  # type: ignore
                updated_selector_string, attributes.AttributeID.UPLINK_SCRAMBLING_TYPE.value, value
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def get_uplink_scrambling_code(self, selector_string):
        r"""Gets the scrambling code for the uplink channel.

        Use "carrier<*n*>" as the selector string to configure or read this attribute.

        The default value is 0. Valid values are 0 to 16,777,215.

        Args:
            selector_string (string):
                Pass an empty string.

        Returns:
            Tuple (attr_val, error_code):

            attr_val (int):
                Specifies the scrambling code for the uplink channel.

            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
            )
            attr_val, error_code = self._interpreter.get_attribute_i32(  # type: ignore
                updated_selector_string, attributes.AttributeID.UPLINK_SCRAMBLING_CODE.value
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return attr_val, error_code

    @_raise_if_disposed
    def set_uplink_scrambling_code(self, selector_string, value):
        r"""Sets the scrambling code for the uplink channel.

        Use "carrier<*n*>" as the selector string to configure or read this attribute.

        The default value is 0. Valid values are 0 to 16,777,215.

        Args:
            selector_string (string):
                Pass an empty string.

            value (int):
                Specifies the scrambling code for the uplink channel.

        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
            )
            error_code = self._interpreter.set_attribute_i32(  # type: ignore
                updated_selector_string, attributes.AttributeID.UPLINK_SCRAMBLING_CODE.value, value
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def get_downlink_scrambling_type(self, selector_string):
        r"""Gets the scrambling code type.

        Use "carrier<*n*>" as the selector string to configure or read this attribute.

        +--------------+---------------------------------+
        | Name (Value) | Description                     |
        +==============+=================================+
        | Standard (0) | Selects the standard code type. |
        +--------------+---------------------------------+
        | Left (1)     | Selects the left code type      |
        +--------------+---------------------------------+
        | Right (2)    | Selects the right code type     |
        +--------------+---------------------------------+

        Args:
            selector_string (string):
                Pass an empty string.

        Returns:
            Tuple (attr_val, error_code):

            attr_val (enums.DownlinkScramblingType):
                Specifies the scrambling code type.

            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
            )
            attr_val, error_code = self._interpreter.get_attribute_i32(  # type: ignore
                updated_selector_string, attributes.AttributeID.DOWNLINK_SCRAMBLING_TYPE.value
            )
            attr_val = enums.DownlinkScramblingType(attr_val)
        except (KeyError, ValueError):
            raise errors.DriverTooNewError()  # type: ignore
        finally:
            self._session_function_lock.exit_read_lock()

        return attr_val, error_code

    @_raise_if_disposed
    def set_downlink_scrambling_type(self, selector_string, value):
        r"""Sets the scrambling code type.

        Use "carrier<*n*>" as the selector string to configure or read this attribute.

        +--------------+---------------------------------+
        | Name (Value) | Description                     |
        +==============+=================================+
        | Standard (0) | Selects the standard code type. |
        +--------------+---------------------------------+
        | Left (1)     | Selects the left code type      |
        +--------------+---------------------------------+
        | Right (2)    | Selects the right code type     |
        +--------------+---------------------------------+

        Args:
            selector_string (string):
                Pass an empty string.

            value (enums.DownlinkScramblingType, int):
                Specifies the scrambling code type.

        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
            )
            value = value.value if type(value) is enums.DownlinkScramblingType else value
            error_code = self._interpreter.set_attribute_i32(  # type: ignore
                updated_selector_string,
                attributes.AttributeID.DOWNLINK_SCRAMBLING_TYPE.value,
                value,
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def get_downlink_scrambling_primary_code(self, selector_string):
        r"""Gets the primary scrambling code.

        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.

        Args:
            selector_string (string):
                Pass an empty string.

        Returns:
            Tuple (attr_val, error_code):

            attr_val (int):
                Specifies the primary scrambling code.

            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
            )
            attr_val, error_code = self._interpreter.get_attribute_i32(  # type: ignore
                updated_selector_string,
                attributes.AttributeID.DOWNLINK_SCRAMBLING_PRIMARY_CODE.value,
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return attr_val, error_code

    @_raise_if_disposed
    def set_downlink_scrambling_primary_code(self, selector_string, value):
        r"""Sets the primary scrambling code.

        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.

        Args:
            selector_string (string):
                Pass an empty string.

            value (int):
                Specifies the primary scrambling code.

        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
            )
            error_code = self._interpreter.set_attribute_i32(  # type: ignore
                updated_selector_string,
                attributes.AttributeID.DOWNLINK_SCRAMBLING_PRIMARY_CODE.value,
                value,
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def get_downlink_scrambling_secondary_code(self, selector_string):
        r"""Gets the secondary scrambling code.

        Use "carrier<*n*>" as the selector string to configure or read this attribute.

        Args:
            selector_string (string):
                Pass an empty string.

        Returns:
            Tuple (attr_val, error_code):

            attr_val (int):
                Specifies the secondary scrambling code.

            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
            )
            attr_val, error_code = self._interpreter.get_attribute_i32(  # type: ignore
                updated_selector_string,
                attributes.AttributeID.DOWNLINK_SCRAMBLING_SECONDARY_CODE.value,
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return attr_val, error_code

    @_raise_if_disposed
    def set_downlink_scrambling_secondary_code(self, selector_string, value):
        r"""Sets the secondary scrambling code.

        Use "carrier<*n*>" as the selector string to configure or read this attribute.

        Args:
            selector_string (string):
                Pass an empty string.

            value (int):
                Specifies the secondary scrambling code.

        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
            )
            error_code = self._interpreter.set_attribute_i32(  # type: ignore
                updated_selector_string,
                attributes.AttributeID.DOWNLINK_SCRAMBLING_SECONDARY_CODE.value,
                value,
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def get_auto_level_initial_reference_level(self, selector_string):
        r"""Gets the initial reference level that the :py:meth:`auto_level` method uses to estimate the peak power of the
        input signal.

        This value is expressed in dBm.

        The default value is 30.

        Args:
            selector_string (string):
                Pass an empty string.

        Returns:
            Tuple (attr_val, error_code):

            attr_val (float):
                Specifies the initial reference level that the :py:meth:`auto_level` method uses to estimate the peak power of the
                input 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
            )
            attr_val, error_code = self._interpreter.get_attribute_f64(  # type: ignore
                updated_selector_string,
                attributes.AttributeID.AUTO_LEVEL_INITIAL_REFERENCE_LEVEL.value,
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return attr_val, error_code

    @_raise_if_disposed
    def set_auto_level_initial_reference_level(self, selector_string, value):
        r"""Sets the initial reference level that the :py:meth:`auto_level` method uses to estimate the peak power of the
        input signal.

        This value is expressed in dBm.

        The default value is 30.

        Args:
            selector_string (string):
                Pass an empty string.

            value (float):
                Specifies the initial reference level that the :py:meth:`auto_level` method uses to estimate the peak power of the
                input 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
            )
            error_code = self._interpreter.set_attribute_f64(  # type: ignore
                updated_selector_string,
                attributes.AttributeID.AUTO_LEVEL_INITIAL_REFERENCE_LEVEL.value,
                value,
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def get_transmitter_architecture(self, selector_string):
        r"""Gets the RF architecture at the transmitter for a multicarrier signal.

        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 **LO per Carrier**. The I/Q origin offset is always calculated irrespective of the value
        of the Transmitter Architecture attribute.

        +--------------------+--------------------------------------------------------------------------------------------------------------------------+
        | Name (Value)       | Description                                                                                                              |
        +====================+==========================================================================================================================+
        | LO per Carrier (0) | Specifies that the transmitter has one LO at the center of each carrier. The IQ Origin Offset result is an estimate of   |
        |                    | the I/Q origin offset of each carrier.                                                                                   |
        +--------------------+--------------------------------------------------------------------------------------------------------------------------+
        | LO per Band (1)    | Specifies that the transmitter has one LO at the center of all the carriers in the band. The Multicarrier IQ Origin      |
        |                    | Offset result is an estimate of the I/Q origin offset for the LO per Band architecture.                                  |
        +--------------------+--------------------------------------------------------------------------------------------------------------------------+

        Args:
            selector_string (string):
                Pass an empty string.

        Returns:
            Tuple (attr_val, error_code):

            attr_val (enums.TransmitterArchitecture):
                Specifies the RF architecture at the transmitter for a multicarrier 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
            )
            attr_val, error_code = self._interpreter.get_attribute_i32(  # type: ignore
                updated_selector_string, attributes.AttributeID.TRANSMITTER_ARCHITECTURE.value
            )
            attr_val = enums.TransmitterArchitecture(attr_val)
        except (KeyError, ValueError):
            raise errors.DriverTooNewError()  # type: ignore
        finally:
            self._session_function_lock.exit_read_lock()

        return attr_val, error_code

    @_raise_if_disposed
    def set_transmitter_architecture(self, selector_string, value):
        r"""Sets the RF architecture at the transmitter for a multicarrier signal.

        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 **LO per Carrier**. The I/Q origin offset is always calculated irrespective of the value
        of the Transmitter Architecture attribute.

        +--------------------+--------------------------------------------------------------------------------------------------------------------------+
        | Name (Value)       | Description                                                                                                              |
        +====================+==========================================================================================================================+
        | LO per Carrier (0) | Specifies that the transmitter has one LO at the center of each carrier. The IQ Origin Offset result is an estimate of   |
        |                    | the I/Q origin offset of each carrier.                                                                                   |
        +--------------------+--------------------------------------------------------------------------------------------------------------------------+
        | LO per Band (1)    | Specifies that the transmitter has one LO at the center of all the carriers in the band. The Multicarrier IQ Origin      |
        |                    | Offset result is an estimate of the I/Q origin offset for the LO per Band architecture.                                  |
        +--------------------+--------------------------------------------------------------------------------------------------------------------------+

        Args:
            selector_string (string):
                Pass an empty string.

            value (enums.TransmitterArchitecture, int):
                Specifies the RF architecture at the transmitter for a multicarrier 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
            )
            value = value.value if type(value) is enums.TransmitterArchitecture else value
            error_code = self._interpreter.set_attribute_i32(  # type: ignore
                updated_selector_string,
                attributes.AttributeID.TRANSMITTER_ARCHITECTURE.value,
                value,
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def get_limited_configuration_change(self, selector_string):
        r"""Gets the set of attributes that are considered by RFmx in the locked signal configuration state.

        If your test system performs the same measurement at different selected ports, multiple frequencies, and/or
        power levels repeatedly, you can enable this attribute to help achieve faster measurements. When you set this attribute
        to a value other than **Disabled**, the RFmx driver will use an optimized code path and skip some checks. Because RFmx
        skips some checks when you use this attribute, you need to be aware of the limitations of this feature, which are
        listed in the `Limitations of the Limited Configuration Change Property
        <https://www.ni.com/docs/en-US/bundle/rfmx-wcdma-prop/page/rfmxwcdmaprop/limitations.html>`_ topic.

        You can also use this attribute to lock a specific instrument configuration for a signal so that every time
        that you initiate the signal, RFmx applies the RFmxInstr attributes from a locked configuration.

        NI recommends you use this attribute in conjunction with named signal configurations. Create named signal
        configurations for each measurement configuration in your test program and set this attribute to a value other than
        **Disabled** for one or more of the named signal configurations. This allows RFmx to precompute the acquisition
        settings for your measurement configurations and re-use the precomputed settings each time you initiate the
        measurement. You do not need to use this attribute if you create named signals for all the measurement configurations
        in your test program during test sequence initialization and do not change any RFInstr or personality attributes while
        testing each device under test. RFmx automatically optimizes that use case.

        Specify the named signal configuration you are setting this attribute in the selector string input.  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 topic for information about the string syntax for named signals.

        The default value is **Disabled**.

        +----------------------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | Name (Value)                           | Description                                                                                                              |
        +========================================+==========================================================================================================================+
        | Disabled (0)                           | This is the normal mode of RFmx operation. All configuration changes in RFmxInstr attributes or in personality           |
        |                                        | attributes will be applied during RFmx Commit.                                                                           |
        +----------------------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | No Change (1)                          | Signal configuration is locked after the first Commit of the named signal configuration. Any configuration change        |
        |                                        | thereafter either in RFmxInstr attributes or personality attributes will not be considered by subsequent RFmx Commits    |
        |                                        | or Initiates of this signal. Use **No Change** if you have created named signal configurations for all measurement       |
        |                                        | configurations but are setting some RFmxInstr attributes. Refer to the Limitations of the Limited Configuration Change   |
        |                                        | Property topic for more details about the limitations of using this mode.                                                |
        +----------------------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | Frequency (2)                          | Signal configuration, other than center frequency and external attenuation, is locked after first Commit of the named    |
        |                                        | signal configuration. Thereafter, only the Center Frequency and External Attenuation attribute value changes will be     |
        |                                        | considered by subsequent driver Commits or Initiates of this signal. Refer to the Limitations of the Limited             |
        |                                        | Configuration Change Property topic for more details about the limitations of using this mode.                           |
        +----------------------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | Reference Level (3)                    | Signal configuration, other than the reference level, is locked after first Commit of the named signal configuration.    |
        |                                        | Thereafter only the Reference Level attribute value change will be considered by subsequent driver Commits or Initiates  |
        |                                        | of this signal. If you have configured this signal to use an IQ Power Edge Trigger, NI recommends that you set the IQ    |
        |                                        | Power Edge Level Type to **Relative** so that the trigger level is automatically adjusted as you adjust the reference    |
        |                                        | level. Refer to the Limitations of the Limited Configuration Change Property topic for more details about the            |
        |                                        | limitations of using this mode.                                                                                          |
        +----------------------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | Freq and Ref Level (4)                 | Signal configuration, other than center frequency, reference level, and external attenuation, is locked after first      |
        |                                        | Commit of the named signal configuration. Thereafter only the Center Frequency, Reference Level, and External            |
        |                                        | Attenuation attribute value changes will be considered by subsequent driver Commits or Initiates of this signal. If you  |
        |                                        | have configured this signal to use an IQ Power Edge Trigger, NI recommends that you set the IQ Power Edge Level Type to  |
        |                                        | **Relative** so that the trigger level is automatically adjusted as you adjust the reference level. Refer to the         |
        |                                        | Limitations of the Limited Configuration Change Property topic for more details about the limitations of using this      |
        |                                        | mode.                                                                                                                    |
        +----------------------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | Selected Ports, Freq and Ref Level (5) | Signal configuration, other than selected ports, center frequency, reference level, external attenuation, and RFInstr    |
        |                                        | configuration, is locked after first Commit or Initiate of the named signal configuration. Thereafter only Selected      |
        |                                        | Ports, Center Frequency, Reference Level, and External Attenuation attribute value changes will be considered by         |
        |                                        | subsequent driver Commits or Initiates of this signal. If you have configured this signal to use an IQ Power Edge        |
        |                                        | Trigger, NI recommends you set the IQ Power Edge Level Type to **Relative** so that the trigger level is automatically   |
        |                                        | adjusted as you adjust the reference level. Refer to the Limitations of the Limited Configuration Change Property topic  |
        |                                        | for more details about the limitations of using this mode.                                                               |
        +----------------------------------------+--------------------------------------------------------------------------------------------------------------------------+

        Args:
            selector_string (string):
                Pass an empty string.

        Returns:
            Tuple (attr_val, error_code):

            attr_val (enums.LimitedConfigurationChange):
                Specifies the set of attributes that are considered by RFmx in the locked signal configuration state.

            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
            )
            attr_val, error_code = self._interpreter.get_attribute_i32(  # type: ignore
                updated_selector_string, attributes.AttributeID.LIMITED_CONFIGURATION_CHANGE.value
            )
            attr_val = enums.LimitedConfigurationChange(attr_val)
        except (KeyError, ValueError):
            raise errors.DriverTooNewError()  # type: ignore
        finally:
            self._session_function_lock.exit_read_lock()

        return attr_val, error_code

    @_raise_if_disposed
    def set_limited_configuration_change(self, selector_string, value):
        r"""Sets the set of attributes that are considered by RFmx in the locked signal configuration state.

        If your test system performs the same measurement at different selected ports, multiple frequencies, and/or
        power levels repeatedly, you can enable this attribute to help achieve faster measurements. When you set this attribute
        to a value other than **Disabled**, the RFmx driver will use an optimized code path and skip some checks. Because RFmx
        skips some checks when you use this attribute, you need to be aware of the limitations of this feature, which are
        listed in the `Limitations of the Limited Configuration Change Property
        <https://www.ni.com/docs/en-US/bundle/rfmx-wcdma-prop/page/rfmxwcdmaprop/limitations.html>`_ topic.

        You can also use this attribute to lock a specific instrument configuration for a signal so that every time
        that you initiate the signal, RFmx applies the RFmxInstr attributes from a locked configuration.

        NI recommends you use this attribute in conjunction with named signal configurations. Create named signal
        configurations for each measurement configuration in your test program and set this attribute to a value other than
        **Disabled** for one or more of the named signal configurations. This allows RFmx to precompute the acquisition
        settings for your measurement configurations and re-use the precomputed settings each time you initiate the
        measurement. You do not need to use this attribute if you create named signals for all the measurement configurations
        in your test program during test sequence initialization and do not change any RFInstr or personality attributes while
        testing each device under test. RFmx automatically optimizes that use case.

        Specify the named signal configuration you are setting this attribute in the selector string input.  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 topic for information about the string syntax for named signals.

        The default value is **Disabled**.

        +----------------------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | Name (Value)                           | Description                                                                                                              |
        +========================================+==========================================================================================================================+
        | Disabled (0)                           | This is the normal mode of RFmx operation. All configuration changes in RFmxInstr attributes or in personality           |
        |                                        | attributes will be applied during RFmx Commit.                                                                           |
        +----------------------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | No Change (1)                          | Signal configuration is locked after the first Commit of the named signal configuration. Any configuration change        |
        |                                        | thereafter either in RFmxInstr attributes or personality attributes will not be considered by subsequent RFmx Commits    |
        |                                        | or Initiates of this signal. Use **No Change** if you have created named signal configurations for all measurement       |
        |                                        | configurations but are setting some RFmxInstr attributes. Refer to the Limitations of the Limited Configuration Change   |
        |                                        | Property topic for more details about the limitations of using this mode.                                                |
        +----------------------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | Frequency (2)                          | Signal configuration, other than center frequency and external attenuation, is locked after first Commit of the named    |
        |                                        | signal configuration. Thereafter, only the Center Frequency and External Attenuation attribute value changes will be     |
        |                                        | considered by subsequent driver Commits or Initiates of this signal. Refer to the Limitations of the Limited             |
        |                                        | Configuration Change Property topic for more details about the limitations of using this mode.                           |
        +----------------------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | Reference Level (3)                    | Signal configuration, other than the reference level, is locked after first Commit of the named signal configuration.    |
        |                                        | Thereafter only the Reference Level attribute value change will be considered by subsequent driver Commits or Initiates  |
        |                                        | of this signal. If you have configured this signal to use an IQ Power Edge Trigger, NI recommends that you set the IQ    |
        |                                        | Power Edge Level Type to **Relative** so that the trigger level is automatically adjusted as you adjust the reference    |
        |                                        | level. Refer to the Limitations of the Limited Configuration Change Property topic for more details about the            |
        |                                        | limitations of using this mode.                                                                                          |
        +----------------------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | Freq and Ref Level (4)                 | Signal configuration, other than center frequency, reference level, and external attenuation, is locked after first      |
        |                                        | Commit of the named signal configuration. Thereafter only the Center Frequency, Reference Level, and External            |
        |                                        | Attenuation attribute value changes will be considered by subsequent driver Commits or Initiates of this signal. If you  |
        |                                        | have configured this signal to use an IQ Power Edge Trigger, NI recommends that you set the IQ Power Edge Level Type to  |
        |                                        | **Relative** so that the trigger level is automatically adjusted as you adjust the reference level. Refer to the         |
        |                                        | Limitations of the Limited Configuration Change Property topic for more details about the limitations of using this      |
        |                                        | mode.                                                                                                                    |
        +----------------------------------------+--------------------------------------------------------------------------------------------------------------------------+
        | Selected Ports, Freq and Ref Level (5) | Signal configuration, other than selected ports, center frequency, reference level, external attenuation, and RFInstr    |
        |                                        | configuration, is locked after first Commit or Initiate of the named signal configuration. Thereafter only Selected      |
        |                                        | Ports, Center Frequency, Reference Level, and External Attenuation attribute value changes will be considered by         |
        |                                        | subsequent driver Commits or Initiates of this signal. If you have configured this signal to use an IQ Power Edge        |
        |                                        | Trigger, NI recommends you set the IQ Power Edge Level Type to **Relative** so that the trigger level is automatically   |
        |                                        | adjusted as you adjust the reference level. Refer to the Limitations of the Limited Configuration Change Property topic  |
        |                                        | for more details about the limitations of using this mode.                                                               |
        +----------------------------------------+--------------------------------------------------------------------------------------------------------------------------+

        Args:
            selector_string (string):
                Pass an empty string.

            value (enums.LimitedConfigurationChange, int):
                Specifies the set of attributes that are considered by RFmx in the locked signal configuration state.

        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
            )
            value = value.value if type(value) is enums.LimitedConfigurationChange else value
            error_code = self._interpreter.set_attribute_i32(  # type: ignore
                updated_selector_string,
                attributes.AttributeID.LIMITED_CONFIGURATION_CHANGE.value,
                value,
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def get_result_fetch_timeout(self, selector_string):
        r"""Gets the time to wait before results are available in the RFmxWCDMA Attribute.

        This value is expressed in seconds.

        Set this value to a time longer than expected for fetching the measurement. A value of -1 specifies that the
        RFmxWCDMA Attribute waits until the measurement is complete.

        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 10.

        Args:
            selector_string (string):
                Pass an empty string.

        Returns:
            Tuple (attr_val, error_code):

            attr_val (float):
                Specifies the time to wait before results are available in the RFmxWCDMA Attribute.

            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
            )
            attr_val, error_code = self._interpreter.get_attribute_f64(  # type: ignore
                updated_selector_string, attributes.AttributeID.RESULT_FETCH_TIMEOUT.value
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return attr_val, error_code

    @_raise_if_disposed
    def set_result_fetch_timeout(self, selector_string, value):
        r"""Sets the time to wait before results are available in the RFmxWCDMA Attribute.

        This value is expressed in seconds.

        Set this value to a time longer than expected for fetching the measurement. A value of -1 specifies that the
        RFmxWCDMA Attribute waits until the measurement is complete.

        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 10.

        Args:
            selector_string (string):
                Pass an empty string.

            value (float):
                Specifies the time to wait before results are available in the RFmxWCDMA Attribute.

        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
            )
            error_code = self._interpreter.set_attribute_f64(  # type: ignore
                updated_selector_string, attributes.AttributeID.RESULT_FETCH_TIMEOUT.value, value
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def configure_number_of_carriers(self, selector_string, number_of_carriers):
        r"""Configures the number of carriers for ACP, CHP, OBW, SEM, and ModAcc measurements.

        Args:
            selector_string (string):
                Pass an empty string.
                The signal name that is passed when creating the signal configuration is used.

            number_of_carriers (int):
                This parameter specifies the number of carriers. The default value is 1.

        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()
            _helper.validate_not_none(selector_string, "selector_string")
            updated_selector_string = _helper.validate_and_update_selector_string(
                selector_string, self
            )
            error_code = self._interpreter.configure_number_of_carriers(  # type: ignore
                updated_selector_string, number_of_carriers
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def configure_uplink_test_model(self, selector_string, uplink_test_model):
        r"""Configures the uplink test model.

        Use "carrier<*n*>" as the selector string to configure this method.

        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 carrier
                number.

                Example:

                "carrier0"

                You can use the :py:meth:`build_carrier_string` method  to build the selector string.

            uplink_test_model (enums.UplinkTestModel, int):
                This parameter specifies the uplink test model when you set the
                :py:attr:`~nirfmxwcdma.attributes.AttributeID.CHANNEL_CONFIGURATION_MODE` attribute to **Test Model**.

                Each test model is a set of channel configurations defined by the standard.

                Each uplink test model is a set of channel configurations as defined by the reference measurement channels in
                tables C.2.1, C.2.2, C.2.3, C.2.4, C.2.5, C.10.1.4, C.11.1.3, or C.11.1.4 of the *3GPP TS 34.121-1* specification.
                Released specifications from version 6.3.0, release 6 to version 11.5.0, release 11 are supported. Reference
                measurement channels in multiple releases of the specification can be the same. Each uplink test model name starts with
                R<*n*>, where *n* is the oldest release number with a given set of channel configurations. The default value is **R6
                C.2.1**.

                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | Name (Value)              | Description                                                                                                              |
                +===========================+==========================================================================================================================+
                | R6 C.2.1 (0)              | The UL R6 C.2.1 configuration (12.2 kbps) is as defined in Annex C, section C.2.1 of the *3GPP TS 34.121*                |
                |                           | specification, version 6.3.0, release 6.                                                                                 |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R6 C.2.2 (1)              | The UL R6 C.2.2 configuration (64 kbps) is as defined in Annex C, section C.2.2 of the *3GPP TS 34.121* specification,   |
                |                           | version 6.3.0, release 6.                                                                                                |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R6 C.2.3 (2)              | The UL R6 C.2.3 configuration (144 kbps) is as defined in Annex C, section C.2.3 of the *3GPP TS 34.121* specification,  |
                |                           | version 6.3.0, release 6.                                                                                                |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R6 C.2.4 (3)              | The UL R6 C.2.4 configuration (384 kbps) is as defined in Annex C, section C.2.4 of the *3GPP TS 34.121* specification,  |
                |                           | version 6.3.0, release 6.                                                                                                |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R6 C.2.5 (4)              | The UL R6 C.2.5 configuration (768 kbps) is as defined in Annex C, section C.2.5 of the *3GPP TS 34.121* specification,  |
                |                           | version 6.3.0, release 6.                                                                                                |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R6 C.10.1.4 Subtest1 (5)  | The UL R6 C.10.1.4 Subtest1 is as defined in Annex C, table C.10.1.4 Sub-Test 1 of the 3GPP TS 34.121 specification,     |
                |                           | release 6.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R6 C.10.1.4 Subtest2 (6)  | The UL R6 C.10.1.4 Subtest2 is as defined in Annex C, table C.10.1.4 Sub-Test 2 of the 3GPP TS 34.121 specification,     |
                |                           | release 6.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R6 C.10.1.4 Subtest3 (7)  | The UL R6 C.10.1.4 Subtest3 is as defined in Annex C, table C.10.1.4 Sub-Test 3 of the 3GPP TS 34.121 specification,     |
                |                           | release 6.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R6 C.10.1.4 Subtest4 (8)  | The UL R6 C.10.1.4 Subtest4 is as defined in Annex C, table C.10.1.4 Sub-Test 4 of the 3GPP TS 34.121 specification,     |
                |                           | release 6.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R6 C.10.1.4 Subtest5 (9)  | The UL R6 C.10.1.4 Subtest5 is as defined in Annex C, table C.10.1.4 Sub-Test 5 of the 3GPP TS 34.121 specification,     |
                |                           | release 6.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R6 C.10.1.4 Subtest6 (10) | The UL R6 C.10.1.4 Subtest6 is as defined in Annex C, table C.10.1.4 Sub-Test 6 of the 3GPP TS 34.121 specification,     |
                |                           | release 6.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R7 C.10.1.4 Subtest1 (11) | The UL R7 C.10.1.4 Subtest1 is as defined in Annex C, table C.10.1.4 Sub-Test 1 of the 3GPP TS 34.121-1 specification,   |
                |                           | release 7.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R7 C.10.1.4 Subtest2 (12) | The UL R7 C.10.1.4 Subtest2 is as defined in Annex C, table C.10.1.4 Sub-Test 2 of the 3GPP TS 34.121-1 specification,   |
                |                           | release 7.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R7 C.10.1.4 Subtest3 (13) | The UL R7 C.10.1.4 Subtest3 is as defined in Annex C, table C.10.1.4 Sub-Test 3 of the 3GPP TS 34.121-1 specification,   |
                |                           | release 7.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R7 C.10.1.4 Subtest4 (14) | The UL R7 C.10.1.4 Subtest4 is as defined in Annex C, table C.10.1.4 Sub-Test 4 of the 3GPP TS 34.121-1 specification,   |
                |                           | release 7.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R7 C.11.1.3 Subtest1 (15) | The UL R7 C.11.1.3 Subtest1 is as defined in Annex C, table C.11.1.3 Sub-Test 1 of the 3GPP TS 34.121-1 specification,   |
                |                           | release 7.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R7 C.11.1.3 Subtest2 (16) | The UL R7 C.11.1.3 Subtest2 is as defined in Annex C, table C.11.1.3 Sub-Test 2 of the 3GPP TS 34.121-1 specification,   |
                |                           | release 7.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R7 C.11.1.3 Subtest3 (17) | The UL R7 C.11.1.3 Subtest3 is as defined in Annex C, table C.11.1.3 Sub-Test 3 of the 3GPP TS 34.121-1 specification,   |
                |                           | release 7.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R7 C.11.1.3 Subtest4 (18) | The UL R7 C.11.1.3 Subtest4 is as defined in Annex C, table C.11.1.3 Sub-Test 4 of the 3GPP TS 34.121-1 specification,   |
                |                           | release 7.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R7 C.11.1.3 Subtest5 (19) | The UL R7 C.11.1.3 Subtest5 is as defined in Annex C, table C.11.1.3 Sub-Test 5 of the 3GPP TS 34.121-1 specification,   |
                |                           | release 7.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R8 C.11.1.3 Subtest1 (20) | The UL R8 C.11.1.3 Subtest1 is as defined in Annex C, table C.11.1.3 Sub-Test 1 of the 3GPP TS 34.121-1 specification,   |
                |                           | release 8.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R8 C.11.1.3 Subtest2 (21) | The UL R8 C.11.1.3 Subtest2 is as defined in Annex C, table C.11.1.3 Sub-Test 2 of the 3GPP TS 34.121-1 specification,   |
                |                           | release 8.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R8 C.11.1.3 Subtest3 (22) | The UL R8 C.11.1.3 Subtest3 is as defined in Annex C, table C.11.1.3 Sub-Test 3 of the 3GPP TS 34.121-1 specification,   |
                |                           | release 8.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R8 C.11.1.3 Subtest4 (23) | The UL R8 C.11.1.3 Subtest4 is as defined in Annex C, table C.11.1.3 Sub-Test 4 of the 3GPP TS 34.121-1 specification,   |
                |                           | release 8.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R8 C.11.1.3 Subtest5 (24) | The UL R8 C.11.1.3 Subtest5 is as defined in Annex C, table C.11.1.3 Sub-Test 5 of the 3GPP TS 34.121-1 specification,   |
                |                           | release 8.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R8 C.11.1.4 Subtest1 (25) | The UL R8 C.11.1.4 Subtest1 is as defined in Annex C, table C.11.1.4 Sub-Test 1 of the 3GPP TS 34.121-1 specification,   |
                |                           | release 8.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+

        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()
            _helper.validate_not_none(selector_string, "selector_string")
            uplink_test_model = (
                uplink_test_model.value
                if type(uplink_test_model) is enums.UplinkTestModel
                else uplink_test_model
            )
            updated_selector_string = _helper.validate_and_update_selector_string(
                selector_string, self
            )
            error_code = self._interpreter.configure_uplink_test_model(  # type: ignore
                updated_selector_string, uplink_test_model
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def configure_uplink_scrambling(
        self, selector_string, uplink_scrambling_code, uplink_scrambling_type
    ):
        r"""Configures the uplink scrambling type and the scrambling code.

        Use "carrier<*n*>" as the selector string to configure this method.

        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 carrier
                number.

                Example:

                "carrier0"

                You can use the :py:meth:`build_carrier_string` method  to build the selector string.

            uplink_scrambling_code (int):
                This parameter specifies the scrambling code for the uplink channel. The default value is 0.

                Valid values are 0 to 16,777,215.

            uplink_scrambling_type (enums.UplinkScramblingType, int):
                This parameter specifies the type of scrambling to use for the measurement. The default value is **Long**.

                +--------------+--------------------------------------------------------------------------------------------------------------------------+
                | Name (Value) | Description                                                                                                              |
                +==============+==========================================================================================================================+
                | Long (0)     | A long scrambling code as defined in section 4.3.2 of the * 3GPP TS 25.213* specification, version 11.4.0, release 11,   |
                |              | is used.                                                                                                                 |
                +--------------+--------------------------------------------------------------------------------------------------------------------------+
                | Short (1)    | A short scrambling code as defined in section 4.3.2 of the * 3GPP TS 25.213* specification, version 11.4.0, release 11,  |
                |              | is used.                                                                                                                 |
                +--------------+--------------------------------------------------------------------------------------------------------------------------+

        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()
            _helper.validate_not_none(selector_string, "selector_string")
            uplink_scrambling_type = (
                uplink_scrambling_type.value
                if type(uplink_scrambling_type) is enums.UplinkScramblingType
                else uplink_scrambling_type
            )
            updated_selector_string = _helper.validate_and_update_selector_string(
                selector_string, self
            )
            error_code = self._interpreter.configure_uplink_scrambling(  # type: ignore
                updated_selector_string, uplink_scrambling_code, uplink_scrambling_type
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def configure_user_defined_channel_array(
        self, selector_string, spreading_factor, spreading_code, modulation_type, branch
    ):
        r"""Configures an array of spreading factors, spreading codes, modulation types, and branches of the user-defined channels.
        Before calling this method,  you must configure the :py:attr:`~nirfmxwcdma.attributes.AttributeID.NUMBER_OF_CHANNELS`
        attribute with the appropriate number of user-defined channels.

        Use "carrier<*n*>" as the selector string to configure this method.

        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 carrier
                number.

                Example:

                "carrier0"

                You can use the :py:meth:`build_carrier_string` method  to build the selector string.

            spreading_factor (int):
                This parameter specifies an array of spreading factor of the channels. The default value is 256. Valid values are 2, 4,
                8,16, 32, 64, 128, and 256.

            spreading_code (int):
                This parameter specifies an array of spreading code of the channels.

                The default value is 0. Valid values are 0 to (*Spreading factor* - 1).

            modulation_type (enums.ModulationType, int):
                This parameter specifies an array of modulation types of the channels. The default value is **BPSK/QPSK**.

                +----------------+-------------------------------+
                | Name (Value)   | Description                   |
                +================+===============================+
                | BPSK/QPSK (0)  | The modulation type is BPSK.  |
                +----------------+-------------------------------+
                | 4PAM/16QAM (1) | The modulation type is 4 PAM. |
                +----------------+-------------------------------+

            branch (enums.Branch, int):
                This parameter specifies an array of branches on which the data is modulated in the channel. The default value is
                **I**.

                +--------------+---------------------------------------------------------+
                | Name (Value) | Description                                             |
                +==============+=========================================================+
                | I (0)        | The signal is modulated in the in-phase branch.         |
                +--------------+---------------------------------------------------------+
                | Q (1)        | The signal is modulated in the quadrature-phase branch. |
                +--------------+---------------------------------------------------------+

        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()
            _helper.validate_not_none(selector_string, "selector_string")
            modulation_type = (
                [v.value for v in modulation_type]
                if (
                    isinstance(modulation_type, list)
                    and all(isinstance(v, enums.ModulationType) for v in modulation_type)
                )
                else modulation_type
            )
            branch = (
                [v.value for v in branch]
                if (isinstance(branch, list) and all(isinstance(v, enums.Branch) for v in branch))
                else branch
            )
            updated_selector_string = _helper.validate_and_update_selector_string(
                selector_string, self
            )
            error_code = self._interpreter.configure_user_defined_channel_array(  # type: ignore
                updated_selector_string, spreading_factor, spreading_code, modulation_type, branch
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def configure_user_defined_channel(
        self, selector_string, spreading_factor, spreading_code, modulation_type, branch
    ):
        r"""Configures the spreading factor, spreading code, modulation type, and branch of each user-defined channel. Before
        calling this method,  you must configure the :py:attr:`~nirfmxwcdma.attributes.AttributeID.NUMBER_OF_CHANNELS`
        attribute with the appropriate number of channels.

        Use "carrier<*k*>/channel<*n*>" as the selector string to configure this method.

        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 carrier
                number, and channel number. The default
                value is "carrier0/channel0".

                Example:

                "carrier0/channel0"

                You can use the :py:meth:`build_channel_string` method  to build the selector string.

            spreading_factor (int):
                This parameter specifies the spreading factor of the channel. The default value is 256. Valid values are 2, 4, 8, 16,
                32, 64, 128, and 256.

            spreading_code (int):
                This parameter specifies the spreading code of the channel.

                The default value is 0. Valid values are 0 to (Spreading factor - 1).

            modulation_type (enums.ModulationType, int):
                This parameter specifies the modulation type of the channel. The default value is **BPSK/QPSK**.

                +----------------+-------------------------------+
                | Name (Value)   | Description                   |
                +================+===============================+
                | BPSK/QPSK (0)  | The modulation type is BPSK.  |
                +----------------+-------------------------------+
                | 4PAM/16QAM (1) | The modulation type is 4 PAM. |
                +----------------+-------------------------------+

            branch (enums.Branch, int):
                This parameter specifies the branch on which the data is modulated. The default value is **I**.

                +--------------+---------------------------------------------------------+
                | Name (Value) | Description                                             |
                +==============+=========================================================+
                | I (0)        | The signal is modulated in the in-phase branch.         |
                +--------------+---------------------------------------------------------+
                | Q (1)        | The signal is modulated in the quadrature-phase branch. |
                +--------------+---------------------------------------------------------+

        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()
            _helper.validate_not_none(selector_string, "selector_string")
            modulation_type = (
                modulation_type.value
                if type(modulation_type) is enums.ModulationType
                else modulation_type
            )
            branch = branch.value if type(branch) is enums.Branch else branch
            updated_selector_string = _helper.validate_and_update_selector_string(
                selector_string, self
            )
            error_code = self._interpreter.configure_user_defined_channel(  # type: ignore
                updated_selector_string, spreading_factor, spreading_code, modulation_type, branch
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def configure_rf(
        self, selector_string, center_frequency, reference_level, external_attenuation
    ):
        r"""Configures the RF attributes of the signal specified by the selector string.

        Args:
            selector_string (string):
                Pass an empty string.
                The signal name that is passed when creating the signal configuration is used.

            center_frequency (float):
                This parameter specifies the center frequency of the acquired RF signal for a single carrier. For multicarrier
                measurements, the This parameter parameter specifies the reference frequency for the values in the
                :py:attr:`~nirfmxwcdma.attributes.AttributeID.CARRIER_FREQUENCY` attribute. This value is expressed in Hz. The default
                value of this parameter is hardware dependent.

            reference_level (float):
                This parameter specifies the reference level that represents the maximum expected power of an RF input signal. This
                value is expressed in dBm for RF devices and V\ :sub:`pk-pk`\ for baseband devices. The default value of this parameter
                is hardware dependent.

            external_attenuation (float):
                This parameter specifies the attenuation of a switch or cable connected to the RF IN connector of the signal analyzer.

                For more information about attenuation, refer to the RF Attenuation and Signal Levels topic for your device in
                the *NI RF Vector Signal Analyzers Help*. This value is expressed in dB. The default value is 0.

        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()
            _helper.validate_not_none(selector_string, "selector_string")
            updated_selector_string = _helper.validate_and_update_selector_string(
                selector_string, self
            )
            error_code = self._interpreter.configure_rf(  # type: ignore
                updated_selector_string, center_frequency, reference_level, external_attenuation
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def configure_reference_level(self, selector_string, reference_level):
        r"""Configures the reference level, which represents the maximum expected power of an RF input signal.

        Args:
            selector_string (string):
                Pass an empty string.
                The signal name that is passed when creating the signal configuration is used.

            reference_level (float):
                This parameter specifies the reference level, which represents the maximum expected power of an RF input signal. This
                value is expressed in dBm for RF devices and V\ :sub:`pk-pk`\ for baseband devices. The default value of this parameter
                is hardware dependent.

        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()
            _helper.validate_not_none(selector_string, "selector_string")
            updated_selector_string = _helper.validate_and_update_selector_string(
                selector_string, self
            )
            error_code = self._interpreter.configure_reference_level(  # type: ignore
                updated_selector_string, reference_level
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def configure_band(self, selector_string, band):
        r"""Configures the Universal Mobile Telecommunications System (UMTS) operating band.

        Args:
            selector_string (string):
                Pass an empty string.
                The signal name that is passed when creating the signal configuration is used.

            band (int):
                This parameter specifies the UMTS operation band. The default value is **1**.

                +--------------+--------------------------------------------+
                | Name (Value) | Description                                |
                +==============+============================================+
                | 1 (1)        | The terminal operates in UMTS Band I.      |
                +--------------+--------------------------------------------+
                | 2 (2)        | The terminal operates in UMTS Band II.     |
                +--------------+--------------------------------------------+
                | 3 (3)        | The terminal operates in UMTS Band III.    |
                +--------------+--------------------------------------------+
                | 4 (4)        | The terminal operates in UMTS Band IV.     |
                +--------------+--------------------------------------------+
                | 5 (5)        | The terminal operates in UMTS Band V.      |
                +--------------+--------------------------------------------+
                | 6 (6)        | The terminal operates in UMTS Band method. |
                +--------------+--------------------------------------------+
                | 7 (7)        | The terminal operates in UMTS Band VII.    |
                +--------------+--------------------------------------------+
                | 8 (8)        | The terminal operates in UMTS Band VIII.   |
                +--------------+--------------------------------------------+
                | 9 (9)        | The terminal operates in UMTS Band IX.     |
                +--------------+--------------------------------------------+
                | 10 (10)      | The terminal operates in UMTS Band X.      |
                +--------------+--------------------------------------------+
                | 11 (11)      | The terminal operates in UMTS Band XI.     |
                +--------------+--------------------------------------------+
                | 12 (12)      | The terminal operates in UMTS Band XII.    |
                +--------------+--------------------------------------------+
                | 13 (13)      | The terminal operates in UMTS Band XIII.   |
                +--------------+--------------------------------------------+
                | 14 (14)      | The terminal operates in UMTS Band XIV.    |
                +--------------+--------------------------------------------+
                | 19 (19)      | The terminal operates in UMTS Band XIX.    |
                +--------------+--------------------------------------------+
                | 20 (20)      | The terminal operates in UMTS Band XX.     |
                +--------------+--------------------------------------------+
                | 21 (21)      | The terminal operates in UMTS Band XXI.    |
                +--------------+--------------------------------------------+
                | 22 (22)      | The terminal operates in UMTS Band XXII.   |
                +--------------+--------------------------------------------+
                | 25 (25)      | The terminal operates in UMTS Band XXV.    |
                +--------------+--------------------------------------------+
                | 26 (26)      | The terminal operates in UMTS Band XXVI.   |
                +--------------+--------------------------------------------+

        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()
            _helper.validate_not_none(selector_string, "selector_string")
            updated_selector_string = _helper.validate_and_update_selector_string(
                selector_string, self
            )
            error_code = self._interpreter.configure_band(  # type: ignore
                updated_selector_string, band
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def configure_carrier_frequency_array(self, selector_string, carrier_frequency):
        r"""Configures an array of the center frequencies of the carriers, relative to the RF center frequency.

        Args:
            selector_string (string):
                Pass an empty string.
                The signal name that is passed when creating the signal configuration is used.

            carrier_frequency (float):
                This parameter specifies an array of the center frequencies of the carriers, relative to the RF center frequency.

                This value is expressed in Hz.

        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()
            _helper.validate_not_none(selector_string, "selector_string")
            updated_selector_string = _helper.validate_and_update_selector_string(
                selector_string, self
            )
            error_code = self._interpreter.configure_carrier_frequency_array(  # type: ignore
                updated_selector_string, carrier_frequency
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def configure_carrier_frequency(self, selector_string, carrier_frequency):
        r"""Configures the center frequency of the carrier, relative to the RF center frequency.

        Use "carrier<*n*>" as the selector string to configure this method.

        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 carrier
                number.

                Example:

                "carrier0"

                You can use the :py:meth:`build_carrier_string` method  to build the selector string.

            carrier_frequency (float):
                This parameter specifies the center frequency of the carrier, relative to the RF center frequency. This value is
                expressed in Hz. The default value is 0.

        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()
            _helper.validate_not_none(selector_string, "selector_string")
            updated_selector_string = _helper.validate_and_update_selector_string(
                selector_string, self
            )
            error_code = self._interpreter.configure_carrier_frequency(  # type: ignore
                updated_selector_string, carrier_frequency
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def configure_channel_configuration_mode(self, selector_string, channel_configuration_mode):
        r"""Configures the channel configuration mode.

        Args:
            selector_string (string):
                Pass an empty string.
                The signal name that is passed when creating the signal configuration is used.

            channel_configuration_mode (enums.ChannelConfigurationMode, int):
                This parameter specifies the channel configuration mode. The default value is **Auto Detect**.

                +------------------+--------------------------------------------------------------------------------------------------------------------------+
                | Name (Value)     | Description                                                                                                              |
                +==================+==========================================================================================================================+
                | Auto Detect (0)  | The measurement detects the channels.                                                                                    |
                +------------------+--------------------------------------------------------------------------------------------------------------------------+
                | User Defined (1) | Configure the channels using the Num Channels attribute and the RFmxWCDMA Configure User Defined Channel (Array)         |
                |                  | method.                                                                                                                  |
                +------------------+--------------------------------------------------------------------------------------------------------------------------+
                | Test Model (2)   | Choose from the standard-defined channel configurations using the UL Test Model attribute.                               |
                +------------------+--------------------------------------------------------------------------------------------------------------------------+

        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()
            _helper.validate_not_none(selector_string, "selector_string")
            channel_configuration_mode = (
                channel_configuration_mode.value
                if type(channel_configuration_mode) is enums.ChannelConfigurationMode
                else channel_configuration_mode
            )
            updated_selector_string = _helper.validate_and_update_selector_string(
                selector_string, self
            )
            error_code = self._interpreter.configure_channel_configuration_mode(  # type: ignore
                updated_selector_string, channel_configuration_mode
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def configure_external_attenuation(self, selector_string, external_attenuation):
        r"""Configures the external attenuation.

        Args:
            selector_string (string):
                Pass an empty string.
                The signal name that is passed when creating the signal configuration is used.

            external_attenuation (float):
                This parameter specifies the attenuation of a switch or cable connected to the RF IN connector of the signal analyzer.

                For more information about attenuation, refer to the RF Attenuation and Signal Levels topic for your device in
                the *NI RF Vector Signal Analyzers Help*. This value is expressed in dB. The default value is 0.

        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()
            _helper.validate_not_none(selector_string, "selector_string")
            updated_selector_string = _helper.validate_and_update_selector_string(
                selector_string, self
            )
            error_code = self._interpreter.configure_external_attenuation(  # type: ignore
                updated_selector_string, external_attenuation
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def configure_frequency(self, selector_string, center_frequency):
        r"""Configures the RF center frequency.

        Args:
            selector_string (string):
                Pass an empty string.
                The signal name that is passed when creating the signal configuration is used.

            center_frequency (float):
                This parameter specifies the center frequency of the acquired RF signal for a single carrier. For multicarrier
                measurements, the This parameter parameter specifies the reference frequency for the values in the
                :py:attr:`~nirfmxwcdma.attributes.AttributeID.CARRIER_FREQUENCY` attribute. This value is expressed in Hz. The default
                value of this parameter is hardware dependent.

        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()
            _helper.validate_not_none(selector_string, "selector_string")
            updated_selector_string = _helper.validate_and_update_selector_string(
                selector_string, self
            )
            error_code = self._interpreter.configure_frequency(  # type: ignore
                updated_selector_string, center_frequency
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def configure_uplink_scrambling_array(
        self, selector_string, uplink_scrambling_type, uplink_scrambling_code
    ):
        r"""Configures the scrambling code and the scrambling code type for all the carriers.

        Args:
            selector_string (string):
                Pass an empty string.
                The signal name that is passed when creating the signal configuration is used.

            uplink_scrambling_type (enums.UplinkScramblingType, int):
                This parameter specifies the array of scrambling codes for the uplink channel. The default value is 0.

                Valid values are 0 to 16,777,215.

            uplink_scrambling_code (int):
                This parameter specifies the array of types of scrambling to use for the measurement. The default value is **Long**.

                +--------------+--------------------------------------------------------------------------------------------------------------------------+
                | Name (Value) | Description                                                                                                              |
                +==============+==========================================================================================================================+
                | Long (0)     | A long scrambling code as defined in section 4.3.2 of the * 3GPP TS 25.213* specification, version 11.4.0, release 11,   |
                |              | is used.                                                                                                                 |
                +--------------+--------------------------------------------------------------------------------------------------------------------------+
                | Short (1)    | A short scrambling code as defined in section 4.3.2 of the * 3GPP TS 25.213* specification, version 11.4.0, release 11,  |
                |              | is used.                                                                                                                 |
                +--------------+--------------------------------------------------------------------------------------------------------------------------+

        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()
            _helper.validate_not_none(selector_string, "selector_string")
            uplink_scrambling_type = (
                [v.value for v in uplink_scrambling_type]
                if (
                    isinstance(uplink_scrambling_type, list)
                    and all(
                        isinstance(v, enums.UplinkScramblingType) for v in uplink_scrambling_type
                    )
                )
                else uplink_scrambling_type
            )
            updated_selector_string = _helper.validate_and_update_selector_string(
                selector_string, self
            )
            error_code = self._interpreter.configure_uplink_scrambling_array(  # type: ignore
                updated_selector_string, uplink_scrambling_type, uplink_scrambling_code
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def configure_uplink_test_model_array(self, selector_string, uplink_test_model):
        r"""Configures the uplink test model for all the carriers.

        Args:
            selector_string (string):
                Pass an empty string.
                The signal name that is passed when creating the signal configuration is used.

            uplink_test_model (enums.UplinkTestModel, int):
                This parameter specifies the array of uplink test models when you set the
                :py:attr:`~nirfmxwcdma.attributes.AttributeID.CHANNEL_CONFIGURATION_MODE` attribute to **Test Model**.

                Each test model is a set of channel configurations defined by the standard.

                Each uplink test model is a set of channel configurations as defined by the reference measurement channels in
                tables C.2.1, C.2.2, C.2.3, C.2.4, C.2.5, C.10.1.4, C.11.1.3, or C.11.1.4 of the *3GPP TS 34.121-1* specification.
                Released specifications from version 6.3.0, release 6 to version 11.5.0, release 11 are supported. Reference
                measurement channels in multiple releases of the specification can be the same. Each uplink test model name starts with
                R<*n*>, where *n* is the oldest release number with a given set of channel configurations. The default value is **R6
                C.2.1**.

                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | Name (Value)              | Description                                                                                                              |
                +===========================+==========================================================================================================================+
                | R6 C.2.1 (0)              | The UL R6 C.2.1 configuration (12.2 kbps) is as defined in Annex C, section C.2.1 of the *3GPP TS 34.121*                |
                |                           | specification, version 6.3.0, release 6.                                                                                 |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R6 C.2.2 (1)              | The UL R6 C.2.2 configuration (64 kbps) is as defined in Annex C, section C.2.2 of the *3GPP TS 34.121* specification,   |
                |                           | version 6.3.0, release 6.                                                                                                |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R6 C.2.3 (2)              | The UL R6 C.2.3 configuration (144 kbps) is as defined in Annex C, section C.2.3 of the *3GPP TS 34.121* specification,  |
                |                           | version 6.3.0, release 6.                                                                                                |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R6 C.2.4 (3)              | The UL R6 C.2.4 configuration (384 kbps) is as defined in Annex C, section C.2.4 of the *3GPP TS 34.121* specification,  |
                |                           | version 6.3.0, release 6.                                                                                                |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R6 C.2.5 (4)              | The UL R6 C.2.5 configuration (768 kbps) is as defined in Annex C, section C.2.5 of the *3GPP TS 34.121* specification,  |
                |                           | version 6.3.0, release 6.                                                                                                |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R6 C.10.1.4 Subtest1 (5)  | The UL R6 C.10.1.4 Subtest1 is as defined in Annex C, table C.10.1.4 Sub-Test 1 of the 3GPP TS 34.121 specification,     |
                |                           | release 6.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R6 C.10.1.4 Subtest2 (6)  | The UL R6 C.10.1.4 Subtest2 is as defined in Annex C, table C.10.1.4 Sub-Test 2 of the 3GPP TS 34.121 specification,     |
                |                           | release 6.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R6 C.10.1.4 Subtest3 (7)  | The UL R6 C.10.1.4 Subtest3 is as defined in Annex C, table C.10.1.4 Sub-Test 3 of the 3GPP TS 34.121 specification,     |
                |                           | release 6.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R6 C.10.1.4 Subtest4 (8)  | The UL R6 C.10.1.4 Subtest4 is as defined in Annex C, table C.10.1.4 Sub-Test 4 of the 3GPP TS 34.121 specification,     |
                |                           | release 6.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R6 C.10.1.4 Subtest5 (9)  | The UL R6 C.10.1.4 Subtest5 is as defined in Annex C, table C.10.1.4 Sub-Test 5 of the 3GPP TS 34.121 specification,     |
                |                           | release 6.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R6 C.10.1.4 Subtest6 (10) | The UL R6 C.10.1.4 Subtest6 is as defined in Annex C, table C.10.1.4 Sub-Test 6 of the 3GPP TS 34.121 specification,     |
                |                           | release 6.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R7 C.10.1.4 Subtest1 (11) | The UL R7 C.10.1.4 Subtest1 is as defined in Annex C, table C.10.1.4 Sub-Test 1 of the 3GPP TS 34.121-1 specification,   |
                |                           | release 7.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R7 C.10.1.4 Subtest2 (12) | The UL R7 C.10.1.4 Subtest2 is as defined in Annex C, table C.10.1.4 Sub-Test 2 of the 3GPP TS 34.121-1 specification,   |
                |                           | release 7.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R7 C.10.1.4 Subtest3 (13) | The UL R7 C.10.1.4 Subtest3 is as defined in Annex C, table C.10.1.4 Sub-Test 3 of the 3GPP TS 34.121-1 specification,   |
                |                           | release 7.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R7 C.10.1.4 Subtest4 (14) | The UL R7 C.10.1.4 Subtest4 is as defined in Annex C, table C.10.1.4 Sub-Test 4 of the 3GPP TS 34.121-1 specification,   |
                |                           | release 7.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R7 C.11.1.3 Subtest1 (15) | The UL R7 C.11.1.3 Subtest1 is as defined in Annex C, table C.11.1.3 Sub-Test 1 of the 3GPP TS 34.121-1 specification,   |
                |                           | release 7.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R7 C.11.1.3 Subtest2 (16) | The UL R7 C.11.1.3 Subtest2 is as defined in Annex C, table C.11.1.3 Sub-Test 2 of the 3GPP TS 34.121-1 specification,   |
                |                           | release 7.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R7 C.11.1.3 Subtest3 (17) | The UL R7 C.11.1.3 Subtest3 is as defined in Annex C, table C.11.1.3 Sub-Test 3 of the 3GPP TS 34.121-1 specification,   |
                |                           | release 7.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R7 C.11.1.3 Subtest4 (18) | The UL R7 C.11.1.3 Subtest4 is as defined in Annex C, table C.11.1.3 Sub-Test 4 of the 3GPP TS 34.121-1 specification,   |
                |                           | release 7.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R7 C.11.1.3 Subtest5 (19) | The UL R7 C.11.1.3 Subtest5 is as defined in Annex C, table C.11.1.3 Sub-Test 5 of the 3GPP TS 34.121-1 specification,   |
                |                           | release 7.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R8 C.11.1.3 Subtest1 (20) | The UL R8 C.11.1.3 Subtest1 is as defined in Annex C, table C.11.1.3 Sub-Test 1 of the 3GPP TS 34.121-1 specification,   |
                |                           | release 8.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R8 C.11.1.3 Subtest2 (21) | The UL R8 C.11.1.3 Subtest2 is as defined in Annex C, table C.11.1.3 Sub-Test 2 of the 3GPP TS 34.121-1 specification,   |
                |                           | release 8.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R8 C.11.1.3 Subtest3 (22) | The UL R8 C.11.1.3 Subtest3 is as defined in Annex C, table C.11.1.3 Sub-Test 3 of the 3GPP TS 34.121-1 specification,   |
                |                           | release 8.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R8 C.11.1.3 Subtest4 (23) | The UL R8 C.11.1.3 Subtest4 is as defined in Annex C, table C.11.1.3 Sub-Test 4 of the 3GPP TS 34.121-1 specification,   |
                |                           | release 8.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R8 C.11.1.3 Subtest5 (24) | The UL R8 C.11.1.3 Subtest5 is as defined in Annex C, table C.11.1.3 Sub-Test 5 of the 3GPP TS 34.121-1 specification,   |
                |                           | release 8.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+
                | R8 C.11.1.4 Subtest1 (25) | The UL R8 C.11.1.4 Subtest1 is as defined in Annex C, table C.11.1.4 Sub-Test 1 of the 3GPP TS 34.121-1 specification,   |
                |                           | release 8.                                                                                                               |
                +---------------------------+--------------------------------------------------------------------------------------------------------------------------+

        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()
            _helper.validate_not_none(selector_string, "selector_string")
            uplink_test_model = (
                [v.value for v in uplink_test_model]
                if (
                    isinstance(uplink_test_model, list)
                    and all(isinstance(v, enums.UplinkTestModel) for v in uplink_test_model)
                )
                else uplink_test_model
            )
            updated_selector_string = _helper.validate_and_update_selector_string(
                selector_string, self
            )
            error_code = self._interpreter.configure_uplink_test_model_array(  # type: ignore
                updated_selector_string, uplink_test_model
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def configure_number_of_channels_array(self, selector_string, number_of_channels):
        r"""Configures the number of user-defined channels for all the carriers in the measurement. This method is used when you
        set the :py:attr:`~nirfmxwcdma.attributes.AttributeID.CHANNEL_CONFIGURATION_MODE`  attribute to **User Defined**. Call
        this method before you call the :py:meth:`configure_user_defined_channel` method or the
        :py:meth:`configure_user_defined_channel` method.

        Args:
            selector_string (string):
                Pass an empty string.
                The signal name that is passed when creating the signal configuration is used.

            number_of_channels (int):
                This parameter specifies the array of number of channels.

        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()
            _helper.validate_not_none(selector_string, "selector_string")
            updated_selector_string = _helper.validate_and_update_selector_string(
                selector_string, self
            )
            error_code = self._interpreter.configure_number_of_channels_array(  # type: ignore
                updated_selector_string, number_of_channels
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def abort_measurements(self, selector_string):
        r"""Stops acquisition and measurements  associated with signal instance that you specify in the  **Selector String**
        parameter, which were previously initiated by the :py:meth:`initiate` method or measurement read methods. Calling this
        method is optional, unless you want to stop a measurement before it is complete. This method executes even if there is
        an incoming error.

        Args:
            selector_string (string):
                Pass an empty string.
                The signal name that is passed when creating the signal configuration is used.

        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()
            _helper.validate_not_none(selector_string, "selector_string")
            updated_selector_string = _helper.validate_and_update_selector_string(
                selector_string, self
            )
            error_code = self._interpreter.abort_measurements(  # type: ignore
                updated_selector_string
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def auto_level(self, selector_string, measurement_interval):
        r"""Examines the input signal to calculate the peak power level and sets it as the value of the
        :py:attr:`~nirfmxwcdma.attributes.AttributeID.REFERENCE_LEVEL` attribute. Use this method to help calculate an
        approximate setting for the reference level.

        The RFmxWCDMA Auto Level method completes the following tasks:

        #. Resets the mixer level, mixer level offset, and IF output power offset.

        #. Sets the starting reference level to the maximum reference level supported by the device, based on the current RF attenuation, mechanical attenuation, and preamplifier enabled settings.

        #. Iterates to adjust the reference level based on the input signal peak power.

        #. Uses immediate triggering and restores the trigger settings back to user setting after the execution.

        You can also specify the starting reference level using the
        :py:attr:`~nirfmxwcdma.attributes.AttributeID.AUTO_LEVEL_INITIAL_REFERENCE_LEVEL` attribute.

        When using NI 5663, 5665, or 5668R devices, NI recommends that you set an appropriate value for mechanical
        attenuation before calling the RFmxWCDMA Auto Level method. Setting an appropriate value for mechanical attenuation
        reduces the number of times the attenuator settings are changed by this function; thus reducing wear and tear, and
        maximizing the life time of the attenuator.

        Args:
            selector_string (string):
                Pass an empty string.
                The signal name that is passed when creating the signal configuration is used.

            measurement_interval (float):
                This parameter specifies the acquisition length. Use this value to compute the number of samples to acquire from the
                signal analyzer. This value is expressed in seconds. The default value is 10 ms.

                Auto Level method does not use any trigger for acquisition. It ignores the user-configured trigger attributes.
                NI recommends that you set a sufficiently high measurement interval to ensure that the acquired waveform is at least as
                long as one period of the signal.

        Returns:
            Tuple (reference_level, error_code):

            reference_level (float):
                This parameter returns the reference level that represents the maximum expected power of an RF input signal. This value
                is expressed in dBm for RF devices and V\ :sub:`pk-pk`\ for baseband devices. The default value of this parameter is
                hardware dependent.

            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
            )
            reference_level, error_code = self._interpreter.auto_level(  # type: ignore
                updated_selector_string, measurement_interval
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return reference_level, error_code

    @_raise_if_disposed
    def check_measurement_status(self, selector_string):
        r"""Checks the status of the measurement. Use this method to check for any errors that may occur during measurement or to
        check whether the measurement is complete and results are available.

        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.

        Returns:
            Tuple (done, error_code):

            done (bool):
                This parameter indicates whether the measurement is complete.

            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
            )
            done, error_code = self._interpreter.check_measurement_status(  # type: ignore
                updated_selector_string
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return done, error_code

    @_raise_if_disposed
    def clear_all_named_results(self, selector_string):
        r"""Clears all results for the signal that you specify in the **Selector String**  parameter.

        Args:
            selector_string (string):
                Pass an empty string.
                The signal name that is passed when creating the signal configuration is used.

        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()
            _helper.validate_not_none(selector_string, "selector_string")
            updated_selector_string = _helper.validate_and_update_selector_string(
                selector_string, self
            )
            error_code = self._interpreter.clear_all_named_results(  # type: ignore
                updated_selector_string
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def clear_named_result(self, selector_string):
        r"""Clears a result instance specified by the result name in the **Selector String** parameter.

        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.

        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()
            _helper.validate_not_none(selector_string, "selector_string")
            updated_selector_string = _helper.validate_and_update_selector_string(
                selector_string, self
            )
            error_code = self._interpreter.clear_named_result(  # type: ignore
                updated_selector_string
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def commit(self, selector_string):
        r"""Commits settings to the hardware. Calling this method is optional. RFmxWCDMA commits settings to the hardware when you
        call the :py:meth:`initiate` method.

        Args:
            selector_string (string):
                Pass an empty string.
                The signal name that is passed when creating the signal configuration is used.

        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()
            _helper.validate_not_none(selector_string, "selector_string")
            updated_selector_string = _helper.validate_and_update_selector_string(
                selector_string, self
            )
            error_code = self._interpreter.commit(updated_selector_string)  # type: ignore
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def initiate(self, selector_string, result_name):
        r"""Initiates all enabled measurements. Call this method after configuring the signal and measurement. This method
        asynchronously launches measurements in the background and immediately returns to the caller program. You can fetch
        measurement results using the Fetch methods or result attributes in the RFmxWCDMA Attribute.

        To get the status of measurements, use the :py:meth:`wait_for_measurement_complete` method or the
        :py:meth:`check_measurement_status`   method.

        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.  The result name can either be specified through this input or the **Result Name** parameter. If you do not specify the result name in this input,
                either the result name specified by **Result Name** parameter or the default result instance is used.  The default is
                "" (empty string).

                Example:

                "result::r1"

                You can use the :py:meth:`build_result_string` method to build the selector string.

            result_name (string):
                This parameter specifies the name to be associated with measurement results. Provide a unique name, such as "r1", to
                enable fetching multiple measurement results and traces. This input accepts the result name with or without the
                "result::" prefix. The default value is "" (empty string), which refers to the default result instance.

                Example:

                "result::r1"

                "r1"

        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()
            _helper.validate_not_none(selector_string, "selector_string")
            _helper.validate_not_none(result_name, "result_name")
            updated_selector_string = _helper.validate_and_update_selector_string(
                selector_string, self
            )
            error_code = self._interpreter.initiate(  # type: ignore
                updated_selector_string, result_name
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def reset_to_default(self, selector_string):
        r"""Resets a signal to the default values.

        Args:
            selector_string (string):
                Pass an empty string.
                The signal name that is passed when creating the signal configuration is used.

        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()
            _helper.validate_not_none(selector_string, "selector_string")
            updated_selector_string = _helper.validate_and_update_selector_string(
                selector_string, self
            )
            error_code = self._interpreter.reset_to_default(updated_selector_string)  # type: ignore
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def select_measurements(self, selector_string, measurements, enable_all_traces):
        r"""Enables all the measurements that you specify in the **Measurements** parameter and disables all other measurements.

        Args:
            selector_string (string):
                Pass an empty string.
                The signal name that is passed when creating the signal configuration is used.

            measurements (enums.MeasurementTypes, int):
                This parameter specifies the measurements to perform. You can specify one or more of the following measurements. The
                default is an empty array.

                +---------------+------------------------------------+
                | Name (Value)  | Description                        |
                +===============+====================================+
                | ModAcc (0)    | Enables the ModAcc measurement.    |
                +---------------+------------------------------------+
                | ACP (1)       | Enables the ACP measurement.       |
                +---------------+------------------------------------+
                | CHP (2)       | Enables the CHP measurement.       |
                +---------------+------------------------------------+
                | OBW (3)       | Enables the OBW measurement.       |
                +---------------+------------------------------------+
                | SEM (4)       | Enables the SEM measurement.       |
                +---------------+------------------------------------+
                | QEVM (5)      | Enables the QEVM measurement.      |
                +---------------+------------------------------------+
                | SlotPhase (6) | Enables the SlotPhase measurement. |
                +---------------+------------------------------------+
                | CDA (7)       | Enables the CDA measurement.       |
                +---------------+------------------------------------+
                | SlotPower (8) | Enables the SlotPower measurement. |
                +---------------+------------------------------------+

            enable_all_traces (bool):
                This parameter specifies whether to enable all traces for the selected measurements. The default value is FALSE.

        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()
            _helper.validate_not_none(selector_string, "selector_string")
            measurements = (
                measurements.value if type(measurements) is enums.MeasurementTypes else measurements
            )
            updated_selector_string = _helper.validate_and_update_selector_string(
                selector_string, self
            )
            error_code = self._interpreter.select_measurements(  # type: ignore
                updated_selector_string, measurements, int(enable_all_traces)
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def wait_for_measurement_complete(self, selector_string, timeout):
        r"""Waits for the specified number of seconds for all the measurements to complete.

        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.

        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()
            _helper.validate_not_none(selector_string, "selector_string")
            updated_selector_string = _helper.validate_and_update_selector_string(
                selector_string, self
            )
            error_code = self._interpreter.wait_for_measurement_complete(  # type: ignore
                updated_selector_string, timeout
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def configure_frequency_uarfcn(self, selector_string, link_direction, band, uarfcn):
        r"""Configures the center frequency in the universal mobile telecommunications system (UMTS) frequency band using the link
        direction, band, and UARFCN of the received signal.

        Args:
            selector_string (string):
                Pass an empty string.
                The signal name that is passed when creating the signal configuration is used.

            link_direction (enums.LinkDirection, int):
                This parameter specifies the link direction.

                +--------------+----------------------------------------------------------------------+
                | Name (Value) | Description                                                          |
                +==============+======================================================================+
                | Uplink (1)   | The link is from the user equipment to the base transceiver station. |
                +--------------+----------------------------------------------------------------------+

            band (int):
                This parameter specifies the UMTS operation band. The default value is **1**.

                +--------------+--------------------------------------------+
                | Name (Value) | Description                                |
                +==============+============================================+
                | 1 (1)        | The terminal operates in UMTS Band I.      |
                +--------------+--------------------------------------------+
                | 2 (2)        | The terminal operates in UMTS Band II.     |
                +--------------+--------------------------------------------+
                | 3 (3)        | The terminal operates in UMTS Band III.    |
                +--------------+--------------------------------------------+
                | 4 (4)        | The terminal operates in UMTS Band IV.     |
                +--------------+--------------------------------------------+
                | 5 (5)        | The terminal operates in UMTS Band V.      |
                +--------------+--------------------------------------------+
                | 6 (6)        | The terminal operates in UMTS Band method. |
                +--------------+--------------------------------------------+
                | 7 (7)        | The terminal operates in UMTS Band VII.    |
                +--------------+--------------------------------------------+
                | 8 (8)        | The terminal operates in UMTS Band VIII.   |
                +--------------+--------------------------------------------+
                | 9 (9)        | The terminal operates in UMTS Band IX.     |
                +--------------+--------------------------------------------+
                | 10 (10)      | The terminal operates in UMTS Band X.      |
                +--------------+--------------------------------------------+
                | 11 (11)      | The terminal operates in UMTS Band XI.     |
                +--------------+--------------------------------------------+
                | 12 (12)      | The terminal operates in UMTS Band XII.    |
                +--------------+--------------------------------------------+
                | 13 (13)      | The terminal operates in UMTS Band XIII.   |
                +--------------+--------------------------------------------+
                | 14 (14)      | The terminal operates in UMTS Band XIV.    |
                +--------------+--------------------------------------------+
                | 19 (19)      | The terminal operates in UMTS Band XIX.    |
                +--------------+--------------------------------------------+
                | 20 (20)      | The terminal operates in UMTS Band XX.     |
                +--------------+--------------------------------------------+
                | 21 (21)      | The terminal operates in UMTS Band XXI.    |
                +--------------+--------------------------------------------+
                | 22 (22)      | The terminal operates in UMTS Band XXII.   |
                +--------------+--------------------------------------------+
                | 25 (25)      | The terminal operates in UMTS Band XXV.    |
                +--------------+--------------------------------------------+
                | 26 (26)      | The terminal operates in UMTS Band XXVI.   |
                +--------------+--------------------------------------------+

            uarfcn (int):
                This parameter specifies the UTRA absolute radio frequency channel number (UARFCN).

                UARFCN has to be updated according to the band for the uplink, as defined by the general UARFCNs in *Table 4.2:
                UTRA Absolute Radio Frequency Channel Number* in the *3GPP TS 34.121-1* specification, version 11.5.0. Otherwise,
                UARFCN is coerced to the top or bottom UARFCN of the selected band, depending on which is nearer. The center frequency
                then corresponds to this coerced UARFCN as defined by carrier frequencies in *Table 4.1: UARFCN definition (general)*
                of the *3GPP TS 34.121-1* specification, version 11.5.0. The default value is 9,750, which corresponds to the center of
                the UMTS Band I.

        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()
            _helper.validate_not_none(selector_string, "selector_string")
            link_direction = (
                link_direction.value
                if type(link_direction) is enums.LinkDirection
                else link_direction
            )
            updated_selector_string = _helper.validate_and_update_selector_string(
                selector_string, self
            )
            error_code = self._interpreter.configure_frequency_uarfcn(  # type: ignore
                updated_selector_string, link_direction, band, uarfcn
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def configure_contiguous_carriers(
        self, selector_string, number_of_carriers, carrier_at_center_frequency
    ):
        r"""Configures the contiguous carriers based on the number of carriers and the carrier at the center frequency.

        Args:
            selector_string (string):
                Pass an empty string.
                The signal name that is passed when creating the signal configuration is used.

            number_of_carriers (int):
                This parameter specifies the number of carriers. The default value is 1.

            carrier_at_center_frequency (int):
                This parameter specifies the index of the carrier that is at the center frequency.

                Set this parameter to -1 to specify a center frequency at the center of all carriers.

                For example, if you set the value of the **Number of Carriers** parameter to 2, and set the value of the **Carrier at
                Center Frequency** parameter  to 1, the center frequency is at *carrier1*.

                If you set the value of the **Number of Carriers** parameter  to 2, and set the value of  the **Carrier at Center
                Frequency** parameter  to -1, the center frequency is at the center of *carrier0* and *carrier1*.

                If you set the value of the **Number of Carriers** parameter to 3, and set the value of the **Carrier at Center
                Frequency** parameter to either -1 or 1, the center frequency is at *carrier1*, which is the  center of all carriers.

                The default value is -1. Recommended values are  -1 to (Number of Carriers - 1). If you set this parameter to a
                value greater than (Number of Carriers - 1), the value of this parameter is coerced to (Number of Carriers - 1).

        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()
            _helper.validate_not_none(selector_string, "selector_string")
            updated_selector_string = _helper.validate_and_update_selector_string(
                selector_string, self
            )
            error_code = self._interpreter.configure_contiguous_carriers(  # type: ignore
                updated_selector_string, number_of_carriers, carrier_at_center_frequency
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def disable_trigger(self, selector_string):
        r"""Configures the device to not wait for a trigger to mark a reference point within a record. This method defines the
        signal triggering as immediate.

        Args:
            selector_string (string):
                Pass an empty string.
                The signal name that is passed when creating the signal configuration is used.

        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()
            _helper.validate_not_none(selector_string, "selector_string")
            updated_selector_string = _helper.validate_and_update_selector_string(
                selector_string, self
            )
            error_code = self._interpreter.disable_trigger(updated_selector_string)  # type: ignore
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def configure_software_edge_trigger(self, selector_string, trigger_delay, enable_trigger):
        r"""Configures the device to wait for a software trigger and then marks a reference point within the record.

        Args:
            selector_string (string):
                Pass an empty string.
                The signal name that is passed when creating the signal configuration is used.

            trigger_delay (float):
                This parameter specifies the trigger delay time. This value is expressed in seconds. The default value is 0.

            enable_trigger (bool):
                This parameter specifies whether to enable the trigger. The default value is TRUE.

        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()
            _helper.validate_not_none(selector_string, "selector_string")
            updated_selector_string = _helper.validate_and_update_selector_string(
                selector_string, self
            )
            error_code = self._interpreter.configure_software_edge_trigger(  # type: ignore
                updated_selector_string, trigger_delay, int(enable_trigger)
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def configure_digital_edge_trigger(
        self, selector_string, digital_edge_source, digital_edge, trigger_delay, enable_trigger
    ):
        r"""Configures the device to wait for a digital edge trigger and then marks a reference point within the record.

        Args:
            selector_string (string):
                Pass an empty string.
                The signal name that is passed when creating the signal configuration is used.

            digital_edge_source (string):
                This parameter specifies the source terminal for the digital edge trigger. The default value of this parameter is
                hardware dependent.

                +---------------------------+-----------------------------------------------------------+
                | Name (Value)              | Description                                               |
                +===========================+===========================================================+
                | PFI0 (PFI0)               | The trigger is received on PFI 0.                         |
                +---------------------------+-----------------------------------------------------------+
                | PFI1 (PFI1)               | The trigger is received on PFI 1.                         |
                +---------------------------+-----------------------------------------------------------+
                | PXI_Trig0 (PXI_Trig0)     | The trigger is received on PXI trigger line 0.            |
                +---------------------------+-----------------------------------------------------------+
                | PXI_Trig1 (PXI_Trig1)     | The trigger is received on PXI trigger line 1.            |
                +---------------------------+-----------------------------------------------------------+
                | PXI_Trig2 (PXI_Trig2)     | The trigger is received on PXI trigger line 2.            |
                +---------------------------+-----------------------------------------------------------+
                | PXI_Trig3 (PXI_Trig3)     | The trigger is received on PXI trigger line 3.            |
                +---------------------------+-----------------------------------------------------------+
                | PXI_Trig4 (PXI_Trig4)     | The trigger is received on PXI trigger line 4.            |
                +---------------------------+-----------------------------------------------------------+
                | PXI_Trig5 (PXI_Trig5)     | The trigger is received on PXI trigger line 5.            |
                +---------------------------+-----------------------------------------------------------+
                | PXI_Trig6 (PXI_Trig6)     | The trigger is received on PXI trigger line 6.            |
                +---------------------------+-----------------------------------------------------------+
                | PXI_Trig7 (PXI_Trig7)     | The trigger is received on PXI trigger line 7.            |
                +---------------------------+-----------------------------------------------------------+
                | PXI_STAR (PXI_STAR)       | The trigger is received on the PXI star trigger line.     |
                +---------------------------+-----------------------------------------------------------+
                | PXIe_DStarB (PXIe_DStarB) | The trigger is received on the PXIe DStar B trigger line. |
                +---------------------------+-----------------------------------------------------------+
                | TimerEvent (TimerEvent)   | The trigger is received from the timer event.             |
                +---------------------------+-----------------------------------------------------------+

            digital_edge (enums.DigitalEdgeTriggerEdge, int):
                This parameter specifies the trigger edge to detect. The default value is **Rising Edge**.

                +------------------+--------------------------------------------------------+
                | Name (Value)     | Description                                            |
                +==================+========================================================+
                | Rising Edge (0)  | The trigger asserts on the rising edge of the signal.  |
                +------------------+--------------------------------------------------------+
                | Falling Edge (1) | The trigger asserts on the falling edge of the signal. |
                +------------------+--------------------------------------------------------+

            trigger_delay (float):
                This parameter specifies the trigger delay time. This value is expressed in seconds. The default value is 0.

            enable_trigger (bool):
                This parameter specifies whether to enable the trigger. The default value is TRUE.

        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()
            _helper.validate_not_none(selector_string, "selector_string")
            _helper.validate_not_none(digital_edge_source, "digital_edge_source")
            digital_edge = (
                digital_edge.value
                if type(digital_edge) is enums.DigitalEdgeTriggerEdge
                else digital_edge
            )
            updated_selector_string = _helper.validate_and_update_selector_string(
                selector_string, self
            )
            error_code = self._interpreter.configure_digital_edge_trigger(  # type: ignore
                updated_selector_string,
                digital_edge_source,
                digital_edge,
                trigger_delay,
                int(enable_trigger),
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def configure_iq_power_edge_trigger(
        self,
        selector_string,
        iq_power_edge_trigger_source,
        iq_power_edge_slope,
        iq_power_edge_trigger_level,
        trigger_delay,
        minimum_quiet_time_mode,
        minimum_quiet_time_duration,
        iq_power_edge_trigger_level_type,
        enable_trigger,
    ):
        r"""Configures the device to wait for the complex power of the I/Q data to cross the specified threshold and then marks a
        reference point within the record.

        To trigger on bursty signals, specify a minimum quiet time, which ensures that the trigger does not occur in
        the middle of the burst signal. The quiet time must be set to a value smaller than the time between bursts, but large
        enough to ignore power changes within a burst.

        Args:
            selector_string (string):
                Pass an empty string.
                The signal name that is passed when creating the signal configuration is used.

            iq_power_edge_trigger_source (string):
                This parameter specifies the channel from which the device monitors the trigger. The default value of this parameter is
                hardware dependent.

            iq_power_edge_slope (enums.IQPowerEdgeTriggerSlope, int):
                This parameter specifies whether the device asserts the trigger when the signal power is rising or when it is falling.
                The device asserts the trigger when the signal power exceeds the specified level with the slope you specify. The
                default value is **Rising Slope**.

                +-------------------+-------------------------------------------------------+
                | Name (Value)      | Description                                           |
                +===================+=======================================================+
                | Rising Slope (0)  | The trigger asserts when the signal power is rising.  |
                +-------------------+-------------------------------------------------------+
                | Falling Slope (1) | The trigger asserts when the signal power is falling. |
                +-------------------+-------------------------------------------------------+

            iq_power_edge_trigger_level (float):
                This parameter specifies the power level at which the device triggers. This value is expressed in dB when you set the
                **IQ Power Edge Level Type** parameter to **Relative**; and is expressed in dBm when you set the **IQ Power Edge Level
                Type** parameter to **Absolute**. The device asserts the trigger when the signal exceeds the level specified by the
                value of this parameter, taking into consideration the specified slope. The default value of this parameter is hardware
                dependent.

            trigger_delay (float):
                This parameter specifies the trigger delay time. This value is expressed in seconds. The default value is 0.

            minimum_quiet_time_mode (enums.TriggerMinimumQuietTimeMode, int):
                This parameter specifies whether the measurement computes the minimum quiet time used for triggering. The default value
                is **Manual**.

                +--------------+--------------------------------------------------------------------------------------------------+
                | Name (Value) | Description                                                                                      |
                +==============+==================================================================================================+
                | Manual (0)   | The minimum quiet time used for triggering is the value of the **Minimum Quiet Time** parameter. |
                +--------------+--------------------------------------------------------------------------------------------------+
                | Auto (1)     | The measurement computes the minimum quiet time used for triggering.                             |
                +--------------+--------------------------------------------------------------------------------------------------+

            minimum_quiet_time_duration (float):
                This parameter specifies the duration for which the signal must be quiet before the signal analyzer arms the I/Q power
                edge trigger. If you set the **IQ Power Edge Slope** parameter to **Rising Slope**, the signal is quiet when it is
                below the trigger level. If you set the **IQ Power Edge Slope** parameter to **Falling Slope**, the signal is quiet
                when it is above the trigger level. This value is expressed in seconds. The default value of this parameter is hardware
                dependent.

            iq_power_edge_trigger_level_type (enums.IQPowerEdgeTriggerLevelType, int):
                This parameter specifies the reference for the **IQ Power Edge Level** parameter.

                The IQ Power Edge Level Type parameter is used only when you set the
                :py:attr:`~nirfmxwcdma.attributes.AttributeID.TRIGGER_TYPE` attribute to **IQ Power Edge**.

                +--------------+--------------------------------------------------------------------------------------------------+
                | Name (Value) | Description                                                                                      |
                +==============+==================================================================================================+
                | Relative (0) | The **IQ Power Edge Level** parameter is relative to the value of the Reference Level attribute. |
                +--------------+--------------------------------------------------------------------------------------------------+
                | Absolute (1) | The **IQ Power Edge Level** parameter specifies the absolute power.                              |
                +--------------+--------------------------------------------------------------------------------------------------+

            enable_trigger (bool):
                This parameter specifies whether to enable the trigger. The default value is TRUE.

        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()
            _helper.validate_not_none(selector_string, "selector_string")
            _helper.validate_not_none(iq_power_edge_trigger_source, "iq_power_edge_trigger_source")
            iq_power_edge_slope = (
                iq_power_edge_slope.value
                if type(iq_power_edge_slope) is enums.IQPowerEdgeTriggerSlope
                else iq_power_edge_slope
            )
            minimum_quiet_time_mode = (
                minimum_quiet_time_mode.value
                if type(minimum_quiet_time_mode) is enums.TriggerMinimumQuietTimeMode
                else minimum_quiet_time_mode
            )
            iq_power_edge_trigger_level_type = (
                iq_power_edge_trigger_level_type.value
                if type(iq_power_edge_trigger_level_type) is enums.IQPowerEdgeTriggerLevelType
                else iq_power_edge_trigger_level_type
            )
            updated_selector_string = _helper.validate_and_update_selector_string(
                selector_string, self
            )
            error_code = self._interpreter.configure_iq_power_edge_trigger(  # type: ignore
                updated_selector_string,
                iq_power_edge_trigger_source,
                iq_power_edge_slope,
                iq_power_edge_trigger_level,
                trigger_delay,
                minimum_quiet_time_mode,
                minimum_quiet_time_duration,
                iq_power_edge_trigger_level_type,
                int(enable_trigger),
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @staticmethod
    def build_result_string(result_name):
        r"""Creates selector string for use with configuration or fetch.

        Args:
            result_name (string):
                Specifies the result name for building the selector string.
                This input accepts the result name with or without the "result::" prefix.
                Example: "", "result::r1", "r1".

        Returns:
            string:
                Contains the selector string created by this method.
        """
        _helper.validate_not_none(result_name, "result_name")
        return _helper.build_result_string(result_name)

    @staticmethod
    def build_channel_string(selector_string, channel_number):
        r"""Creates the channel string to use as the selector string with the channel configuration and results.

        Args:
            selector_string (string):
                Specifies the result name for building the selector string.

            channel_number (int):
                This parameter specifies the channel number for building the selector string.

        Returns:
            string:
                Contains the selector string created by this method.
        """
        _helper.validate_not_none(selector_string, "selector_string")
        return _helper.build_channel_string(selector_string, channel_number)  # type: ignore

    @staticmethod
    def build_offset_string(selector_string, offset_number):
        r"""Creates the offset string to use as the selector string with the SEM and ACP offset configuration or fetch attributes
        and methods.

        Args:
            selector_string (string):
                Specifies the result name for building the selector string.

            offset_number (int):
                This parameter specifies the offset number for building the selector string.

        Returns:
            string:
                Contains the selector string created by this method.
        """
        _helper.validate_not_none(selector_string, "selector_string")
        return _helper.build_offset_string(selector_string, offset_number)  # type: ignore

    @staticmethod
    def build_carrier_string(selector_string, carrier_number):
        r"""Creates the carrier string to use as the selector string with the SEM and ACP carrier configuration or fetch methods,
        properties, and results.

        Args:
            selector_string (string):
                Specifies the result name for building the selector string.

            carrier_number (int):
                This parameter specifies the carrier number for building the selector string.

        Returns:
            string:
                Contains the selector string created by this method.
        """
        _helper.validate_not_none(selector_string, "selector_string")
        return _helper.build_carrier_string(selector_string, carrier_number)  # type: ignore

    @_raise_if_disposed
    def clone_signal_configuration(self, new_signal_name):
        r"""Creates a new instance of a signal by copying all the properties from an existing signal instance.

        Args:
            new_signal_name (string):
                This parameter specifies the name of the new signal. This parameter accepts the signal name with or without the \"signal::\" prefix.

                Example:

                \"signal::NewSigName\"

                \"NewSigName\"

        Returns:
            Tuple (cloned_signal, error_code):

            cloned_signal (Wcdma):
                Contains a new WCDMA signal instance.

            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(new_signal_name, "new_signal_name")
            updated_new_signal_name = _helper.validate_and_remove_signal_qualifier(
                new_signal_name, self
            )
            cloned_signal, error_code = self._interpreter.clone_signal_configuration(  # type: ignore
                self.signal_configuration_name, updated_new_signal_name
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return cloned_signal, error_code

    @_raise_if_disposed
    def send_software_edge_trigger(self):
        r"""Sends a trigger to the device when you use the RFmxWCDMA Configure Trigger function to choose a software version of a trigger and the device is waiting for the trigger to be sent. You can also use this function to override a hardware trigger.

        This function returns an error in the following situations:

        - You configure an invalid trigger.

        - You have not previously called the initiate function.

        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()
            error_code = self._interpreter.send_software_edge_trigger()  # type: ignore
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def analyze_iq_1_waveform(self, selector_string, result_name, x0, dx, iq, reset):
        r"""Performs the enabled measurements on the  I/Q complex waveform  that you specify in the **IQ** parameter. Call this
        method after you configure the signal and measurement attributes. You can fetch measurement results using the Fetch
        methods or result attributes in the attribute node.
        Use this method only if the :py:attr:`~nirfmxinstr.attribute.AttributeID.RECOMMENDED_ACQUISITION_TYPE` attribute value
        is either **IQ** or **IQ or Spectral**.

        .. note::
           Query the Recommended Acquisition Type attribute from the RFmxInstr Attribute after calling the :py:meth:`commit`
           method.

        Args:
            selector_string (string):
                This parameter specifies the signal name and result name.  The result name can either be specified through this input
                or the **Result Name** parameter. If you do
                not specify the result name in this parameter, either the result name specified by the **Result Name**  parameter  or
                the default result instance is used.

                Example:

                ""

                "result::r1"

                You can use the :py:meth:`build_result_string` method  to build the `Selector String
                <https://www.ni.com/docs/en-US/bundle/rfmx/page/selector-strings-net.html>`_.

            result_name (string):
                This parameter specifies the name to be associated with measurement results. Provide a unique name, such as "r1" to
                enable fetching of multiple measurement results and traces. This input accepts the result name with or without the
                "result::" prefix. The default value is "" (empty string), which refers to the default result instance.

                Example:

                ""

                "result::r1"

                "r1"

            x0 (float):
                This parameter specifies the start time of the input **y** array. This value is expressed in seconds.

            dx (float):
                This parameter specifies the time interval between the samples in the input **y** array. This value is expressed in
                seconds. The reciprocal of **dx** indicates the I/Q rate of the input signal.

            iq (numpy.complex64):
                This parameter specifies an array of complex-valued time domain data. The real and imaginary parts of this complex data
                array correspond to the in-phase (I) and quadrature-phase (Q) data, respectively.

            reset (bool):
                This parameter resets measurement averaging. If you enable averaging, set this parameter to TRUE for the first record
                and FALSE for the subsequent records.

        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()
            _helper.validate_not_none(selector_string, "selector_string")
            _helper.validate_not_none(result_name, "result_name")
            updated_selector_string = _helper.validate_and_update_selector_string(
                selector_string, self
            )
            error_code = self._interpreter.analyze_iq_1_waveform(  # type: ignore
                updated_selector_string, result_name, x0, dx, iq, int(reset)
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def analyze_spectrum_1_waveform(self, selector_string, result_name, x0, dx, spectrum, reset):
        r"""Performs the enabled measurements on the spectrum that you specify in the **Spectrum** parameter. Call this method
        after you configure the signal and measurement attributes. You can fetch measurement results using the Fetch methods or
        result attributes in the attribute node.
        Use this method only if the :py:attr:`~nirfmxinstr.attribute.AttributeID.RECOMMENDED_ACQUISITION_TYPE` attribute value
        is either **Spectral** or **IQ or Spectral**.

        .. note::
           Query the Recommended Acquisition Type attribute from the RFmxInstr Attribute after calling the :py:meth:`commit`
           method.

        Args:
            selector_string (string):
                This parameter specifies the result name.  The result name can either be specified through this input
                or the **Result Name** parameter. If you do
                not specify the result name in this parameter, either the result name specified by the **Result Name**  parameter  or
                the default result instance is used.

                Example:

                ""

                "result::r1"

                You can use the :py:meth:`build_result_string` method to build the `Selector String
                <https://www.ni.com/docs/en-US/bundle/rfmx/page/selector-strings-net.html>`_.

            result_name (string):
                This parameter specifies the name to be associated with measurement results. Provide a unique name, such as "r1" to
                enable fetching of multiple measurement results and traces. This input accepts the result name with or without the
                "result::" prefix. The default value is "" (empty string), which refers to the default result instance.

                Example:

                ""

                "result::r1"

                "r1"

            x0 (float):
                This parameter specifies the start frequency of the spectrum. This value is expressed in Hz.

            dx (float):
                This parameter specifies the frequency interval between data points in the spectrum.

            spectrum (numpy.float32):
                This parameter specifies the data for a spectrum waveform.

            reset (bool):
                This parameter resets measurement averaging. If you enable averaging, set this parameter to TRUE for the first record
                and FALSE for the subsequent records.

        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()
            _helper.validate_not_none(selector_string, "selector_string")
            _helper.validate_not_none(result_name, "result_name")
            updated_selector_string = _helper.validate_and_update_selector_string(
                selector_string, self
            )
            error_code = self._interpreter.analyze_spectrum_1_waveform(  # type: ignore
                updated_selector_string, result_name, x0, dx, spectrum, reset
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code

    @_raise_if_disposed
    def configure_number_of_channels(self, selector_string, number_of_channels):
        r"""Configures the number of channels for the user-defined channel configuration when you set the
        :py:attr:`~nirfmxwcdma.attributes.AttributeID.CHANNEL_CONFIGURATION_MODE` attribute to **User Defined**.

        Args:
            selector_string (string):
                Pass an empty string.
                The signal name that is passed when creating the signal configuration is used.

            number_of_channels (int):
                This parameter specifies the number of user-defined channels. The default value is 0.

        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()
            _helper.validate_not_none(selector_string, "selector_string")
            updated_selector_string = _helper.validate_and_update_selector_string(
                selector_string, self
            )
            error_code = self._interpreter.configure_number_of_channels(  # type: ignore
                updated_selector_string, number_of_channels
            )
        finally:
            self._session_function_lock.exit_read_lock()

        return error_code


[docs] class Wcdma(_WcdmaBase): """Defines a root class which is used to identify and control Wcdma signal configuration.""" def __init__(self, session, signal_name="", cloning=False): """Initializes a Wcdma signal configuration.""" super(Wcdma, self).__init__( session=session, signal_name=signal_name, cloning=cloning, ) # type: ignore def __enter__(self): """Enters the context of the Wcdma signal configuration.""" return self def __exit__(self, exc_type, exc_value, traceback): """Exits the context of the Wcdma signal configuration.""" self.dispose() # type: ignore pass