Source code for qcodes.parameters.val_mapping
from __future__ import annotations
from collections import OrderedDict
from typing import TypeVar
T = TypeVar("T")
[docs]
def create_on_off_val_mapping(
    on_val: T | bool = True, off_val: T | bool = False
) -> OrderedDict[str | bool, T | bool]:
    """
    Returns a value mapping which maps inputs which reasonably mean "on"/"off"
    to the specified ``on_val``/``off_val`` which are to be sent to the
    instrument. This value mapping is such that, when inverted,
    ``on_val``/``off_val`` are mapped to boolean ``True``/``False``.
    """
    # Here are the lists of inputs which "reasonably" mean the same as
    # "on"/"off" (note that True/False values will be added below, and they
    # will always be added)
    ons_: tuple[str | bool, ...] = ("On", "ON", "on", "1")
    offs_: tuple[str | bool, ...] = ("Off", "OFF", "off", "0")
    # The True/False values are added at the end of on/off inputs,
    # so that after inversion True/False will be the only remaining
    # keys in the inverted value mapping dictionary.
    # NOTE that using 1/0 integer values will also work implicitly
    # due to `hash(True) == hash(1)`/`hash(False) == hash(0)`,
    # hence there is no need for adding 1/0 values explicitly to
    # the list of `ons` and `offs` values.
    ons = (*ons_, True)
    offs = (*offs_, False)
    all_vals_tuples = [(on, on_val) for on in ons] + [(off, off_val) for off in offs]
    return OrderedDict(all_vals_tuples)