From ceded7190c8f9f34cb62b43128448f4f121c38f5 Mon Sep 17 00:00:00 2001 From: Neil Dick Date: Fri, 13 Mar 2026 11:31:05 +1100 Subject: [PATCH 1/4] Keysight B2962A: Add remote sensing parameter Add the 'remote sensing' parameter to enable or disable the 4-wire output mode on a B2962A channel. --- src/qcodes/instrument_drivers/Keysight/Keysight_B2962A.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/qcodes/instrument_drivers/Keysight/Keysight_B2962A.py b/src/qcodes/instrument_drivers/Keysight/Keysight_B2962A.py index a2d20e302b2..9ce48f79a4a 100644 --- a/src/qcodes/instrument_drivers/Keysight/Keysight_B2962A.py +++ b/src/qcodes/instrument_drivers/Keysight/Keysight_B2962A.py @@ -127,6 +127,14 @@ def __init__( ) """Parameter source_mode""" + self.remote_sensing: Parameter = self.add_parameter( + "remote_sensing", + get_cmd=f":SENS{chan:d}:REM?", + set_cmd=f":SENS{chan:d}:REM {{:d}}", + val_mapping={"on": 1, "off": 0}, + ) + """Parameter remote_sensing""" + self.channel = chan From 9d0e776c79a90d0198a6b8c7e46fbff8501120c9 Mon Sep 17 00:00:00 2001 From: Neil Dick Date: Mon, 16 Mar 2026 09:03:12 +1100 Subject: [PATCH 2/4] Improve type annotations in B2962A driver Add type hints to the parameters within the b2962a channel so that param.instrument can resolve the correct type. --- .../Keysight/Keysight_B2962A.py | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/qcodes/instrument_drivers/Keysight/Keysight_B2962A.py b/src/qcodes/instrument_drivers/Keysight/Keysight_B2962A.py index 9ce48f79a4a..607332ab80a 100644 --- a/src/qcodes/instrument_drivers/Keysight/Keysight_B2962A.py +++ b/src/qcodes/instrument_drivers/Keysight/Keysight_B2962A.py @@ -1,4 +1,4 @@ -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Self from typing_extensions import deprecated @@ -44,7 +44,7 @@ def __init__( super().__init__(parent, name, **kwargs) - self.source_voltage: Parameter = self.add_parameter( + self.source_voltage: Parameter[float, Self] = self.add_parameter( "source_voltage", label=f"Channel {chan} Voltage", get_cmd=f"SOURCE{chan:d}:VOLT?", @@ -54,7 +54,7 @@ def __init__( ) """Parameter source_voltage""" - self.source_current: Parameter = self.add_parameter( + self.source_current: Parameter[float, Self] = self.add_parameter( "source_current", label=f"Channel {chan} Current", get_cmd=f"SOURCE{chan:d}:CURR?", @@ -64,7 +64,7 @@ def __init__( ) """Parameter source_current""" - self.voltage: Parameter = self.add_parameter( + self.voltage: Parameter[float, Self] = self.add_parameter( "voltage", get_cmd=f"MEAS:VOLT? (@{chan:d})", get_parser=float, @@ -73,7 +73,7 @@ def __init__( ) """Parameter voltage""" - self.current: Parameter = self.add_parameter( + self.current: Parameter[float, Self] = self.add_parameter( "current", get_cmd=f"MEAS:CURR? (@{chan:d})", get_parser=float, @@ -82,7 +82,7 @@ def __init__( ) """Parameter current""" - self.resistance: Parameter = self.add_parameter( + self.resistance: Parameter[float, Self] = self.add_parameter( "resistance", get_cmd=f"MEAS:RES? (@{chan:d})", get_parser=float, @@ -91,7 +91,7 @@ def __init__( ) """Parameter resistance""" - self.voltage_limit: Parameter = self.add_parameter( + self.voltage_limit: Parameter[float, Self] = self.add_parameter( "voltage_limit", get_cmd=f"SENS{chan:d}:VOLT:PROT?", get_parser=float, @@ -101,7 +101,7 @@ def __init__( ) """Parameter voltage_limit""" - self.current_limit: Parameter = self.add_parameter( + self.current_limit: Parameter[float, Self] = self.add_parameter( "current_limit", get_cmd=f"SENS{chan:d}:CURR:PROT?", get_parser=float, @@ -111,7 +111,7 @@ def __init__( ) """Parameter current_limit""" - self.enable: Parameter = self.add_parameter( + self.enable: Parameter[bool, Self] = self.add_parameter( "enable", get_cmd=f"OUTP{chan:d}?", set_cmd=f"OUTP{chan:d} {{:d}}", @@ -119,7 +119,7 @@ def __init__( ) """Parameter enable""" - self.source_mode: Parameter = self.add_parameter( + self.source_mode: Parameter[str, Self] = self.add_parameter( "source_mode", get_cmd=f":SOUR{chan:d}:FUNC:MODE?", set_cmd=f":SOUR{chan:d}:FUNC:MODE {{:s}}", @@ -127,7 +127,7 @@ def __init__( ) """Parameter source_mode""" - self.remote_sensing: Parameter = self.add_parameter( + self.remote_sensing: Parameter[bool, Self] = self.add_parameter( "remote_sensing", get_cmd=f":SENS{chan:d}:REM?", set_cmd=f":SENS{chan:d}:REM {{:d}}", From 7fcdeaba31b661196fd2b55ef5b9b3dd038dbe4c Mon Sep 17 00:00:00 2001 From: Neil Dick Date: Mon, 16 Mar 2026 09:07:10 +1100 Subject: [PATCH 3/4] B2962A: Use create_on_off_val_mapping Use the on_off_val_mapping function to be consistent with other instruments --- src/qcodes/instrument_drivers/Keysight/Keysight_B2962A.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/qcodes/instrument_drivers/Keysight/Keysight_B2962A.py b/src/qcodes/instrument_drivers/Keysight/Keysight_B2962A.py index 607332ab80a..638213dbb42 100644 --- a/src/qcodes/instrument_drivers/Keysight/Keysight_B2962A.py +++ b/src/qcodes/instrument_drivers/Keysight/Keysight_B2962A.py @@ -1,4 +1,5 @@ from typing import TYPE_CHECKING, Self +from qcodes.parameters import create_on_off_val_mapping from typing_extensions import deprecated @@ -115,7 +116,7 @@ def __init__( "enable", get_cmd=f"OUTP{chan:d}?", set_cmd=f"OUTP{chan:d} {{:d}}", - val_mapping={"on": 1, "off": 0}, + val_mapping=create_on_off_val_mapping(on_val=1, off_val=0), ) """Parameter enable""" @@ -131,7 +132,7 @@ def __init__( "remote_sensing", get_cmd=f":SENS{chan:d}:REM?", set_cmd=f":SENS{chan:d}:REM {{:d}}", - val_mapping={"on": 1, "off": 0}, + val_mapping=create_on_off_val_mapping(on_val=1, off_val=0), ) """Parameter remote_sensing""" From d40135bd62cb9c4ffa6257279fa3dd0acebcc6e4 Mon Sep 17 00:00:00 2001 From: "Jens H. Nielsen" Date: Wed, 18 Mar 2026 09:14:38 +0100 Subject: [PATCH 4/4] Sort imports --- src/qcodes/instrument_drivers/Keysight/Keysight_B2962A.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qcodes/instrument_drivers/Keysight/Keysight_B2962A.py b/src/qcodes/instrument_drivers/Keysight/Keysight_B2962A.py index 638213dbb42..5bbdf7d55e7 100644 --- a/src/qcodes/instrument_drivers/Keysight/Keysight_B2962A.py +++ b/src/qcodes/instrument_drivers/Keysight/Keysight_B2962A.py @@ -1,5 +1,4 @@ from typing import TYPE_CHECKING, Self -from qcodes.parameters import create_on_off_val_mapping from typing_extensions import deprecated @@ -10,6 +9,7 @@ VisaInstrument, VisaInstrumentKWArgs, ) +from qcodes.parameters import create_on_off_val_mapping from qcodes.utils.deprecate import QCoDeSDeprecationWarning if TYPE_CHECKING: