Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
5bd0324
Don't add magnet params if communication times out
thangleiter Oct 23, 2025
e512669
Add non-numeric resolution options to parser
thangleiter Oct 23, 2025
4f94c8c
Don't add trigger to program if /MON not installed
thangleiter Oct 23, 2025
abebc6e
Add hardware ramps
thangleiter Nov 5, 2025
ce61f6c
Drop range assertion
thangleiter Nov 7, 2025
99303e0
Correct slope time validator range
thangleiter Nov 7, 2025
01bf81f
Allow MIN and MAX values
thangleiter Nov 7, 2025
24d6038
Add correct parsers
thangleiter Nov 7, 2025
a655f06
Add set_cmd to current parameters
thangleiter Nov 14, 2025
1cf02c7
Use raw value to compute ramp distance
thangleiter Nov 14, 2025
73068bf
Make .get() pass the validator
thangleiter Dec 10, 2025
0d94a0a
Add validator accounting for program clock rate
thangleiter Dec 10, 2025
e0375ef
Jump if ramp delta is below ramp_step()
thangleiter Dec 10, 2025
6be6488
Factor out parsing deprecated arguments
thangleiter Dec 10, 2025
c807dc2
Allow SCPI Mnemonics in aperture_time
thangleiter Dec 11, 2025
e059479
Reduce logging severity when clipping interval
thangleiter Dec 12, 2025
8032633
Merge branch 'enh/driver_improvements' of https://github.com/qutech/Q…
thangleiter Dec 15, 2025
07a1542
Merge remote-tracking branch 'upstream/main' into enh/driver_improvem…
thangleiter Apr 8, 2026
eb1e3a2
typing
thangleiter Apr 13, 2026
9e2a9e8
tune docstrings
thangleiter Apr 13, 2026
7f72aec
typing
thangleiter Apr 13, 2026
9327679
Use stdlib enum.IntFlag over custom Register
thangleiter Apr 13, 2026
76fce63
Add newsfragements
thangleiter Apr 13, 2026
622209a
Rename newsfrag
thangleiter Apr 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/changes/newsfragments/8025.breaking
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Yokogawa GS200: The `step` and `delay` arguments of `ramp_voltage` and `ramp_current` have been deprecated in favor of the `ramp_step` and `ramp_rate` instrument parameters.
Comment thread
thangleiter marked this conversation as resolved.
9 changes: 9 additions & 0 deletions docs/changes/newsfragments/8025.improved_driver
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
Keysight 344xxA: Add SCPI mnemonics (`'MIN'`, `'MAX'`, `'DEF'`) to allowed values where allowed
Oxford Mercury IPS: Allow setting current ramp rate and target
Oxford Triton: Also assume magnet is not available if there is a communication timeout
Yokagawa GS200 Program: Validate program times on multiples of the internal clock rate of 0.1s
Yokagawa GS200 Program: Only add trigger parameter if monitor option is installed
Yokagawa GS200 Program: Add get parser to `count`; allow setting to SCPI mnemonics `'MIN'`, `'MAX'`.
Yokagawa GS200 Program: Add `hold()`, `pause()`, `cont()` methods.
Yokagawa GS200: Add parameters reading out device registers (`status_byte`, `standard_event_register`, `extended_event_register`, `condition_register`)
Yokagawa GS200: Implement hardware ramps. `ramp_mode` parameter switches the mode of output sets between `"JUMP"`, `"SOFTWARE"`, and `"HARDWARE"`. The last uses a program to ramp, software corresponds to the previous ramp implementation. `ramp_step`, `ramp_rate`, `ramp_blocking` configure the way ramps behave.
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from bisect import bisect_left
from contextlib import ExitStack
from functools import partial
from typing import TYPE_CHECKING, Any
from typing import TYPE_CHECKING, Any, Literal, TypeAlias, get_args

import numpy as np
import numpy.typing as npt
Expand All @@ -28,6 +28,8 @@

from typing_extensions import Unpack

NumericScpiMnemonic: TypeAlias = Literal["MIN", "MAX", "DEF"]


class Keysight344xxATrigger(InstrumentChannel["Keysight344xxA"]):
"""Implements triggering parameters and methods of Keysight 344xxA."""
Expand Down Expand Up @@ -946,7 +948,9 @@ def __init__(
set_cmd=self._set_apt_time,
get_cmd=self._get_with_sense_function("APERture"),
get_parser=float,
vals=vals.Numbers(*apt_times[self.model]),
vals=vals.MultiType(
vals.Numbers(*apt_times[self.model]), vals.Enum("MIN", "MAX", "DEF")
),
docstring=textwrap.dedent(
"""\
Specifies the integration time in seconds (called aperture
Expand Down Expand Up @@ -1240,8 +1244,11 @@ def func(value: str) -> None:

return func

def _set_apt_time(self, value: float) -> None:
self._write_with_sense_function("APERture", f"{value:f}")
def _set_apt_time(self, value: float | NumericScpiMnemonic) -> None:
if isinstance(value, float):
self._write_with_sense_function("APERture", f"{value:f}")
else:
self._write_with_sense_function("APERture", f"{value!s}")

# setting aperture time switches aperture mode ON
self.aperture_mode.get()
Expand All @@ -1262,21 +1269,25 @@ def _set_range(self, value: float) -> None:
# resolution settings change with range
self.resolution.get()

def _set_resolution(self, value: float) -> None:
def _set_resolution(self, value: float | NumericScpiMnemonic) -> None:
rang = self.range.get()

# convert both value*range and the resolution factors
# to strings with few digits, so we avoid floating point
# rounding errors.
res_fac_strs = [f"{(v * rang):.1e}" for v in self._resolution_factors]
if f"{value:.1e}" not in res_fac_strs:
raise ValueError(
f"Resolution setting {value:.1e}"
f"({value} at range {rang}) does not exist. "
f"Possible values are {res_fac_strs}"
)

self.write(f"VOLT:DC:RES {value:.1e}")
if value in get_args(NumericScpiMnemonic):
str_value = str(value) # already str, but mypy does not know this
else:
res_fac_strs = [f"{(v * rang):.1e}" for v in self._resolution_factors]
str_value = f"{value:.1e}"
if str_value not in res_fac_strs:
raise ValueError(
f"Resolution setting {str_value}"
f"({value} at range {rang}) does not exist. "
f"Possible values are {res_fac_strs}"
)

self.write(f"VOLT:DC:RES {str_value}")

# NPLC settings change with resolution
self.NPLC.get()
Expand Down
3 changes: 3 additions & 0 deletions src/qcodes/instrument_drivers/oxford/MercuryiPS_VISA.py
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,7 @@ def __init__(
"current_target",
label="Target current",
get_cmd=partial(self._param_getter, "SIG:CSET"),
set_cmd=partial(self._param_setter, "SIG:CSET"),
unit="A",
get_parser=partial(_signal_parser, 1),
)
Expand All @@ -177,7 +178,9 @@ def __init__(
label="Ramp rate (current)",
unit="A/s",
get_cmd=partial(self._param_getter, "SIG:RCST"),
set_cmd=partial(self._param_setter, "SIG:RCST"),
get_parser=partial(_signal_parser, 1 / 60),
set_parser=lambda x: x * 60,
)
"""Parameter current_ramp_rate"""

Expand Down
5 changes: 4 additions & 1 deletion src/qcodes/instrument_drivers/oxford/triton.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,10 @@ def __init__(
self._control_channel = 5
self.pump_label_dict = {"TURB1": "Turbo 1", "COMP": "Compressor"}

self.magnet_available: bool = self._get_control_B_param("ACTN") != "INVALID"
self.magnet_available: bool = self._get_control_B_param("ACTN") not in (
"INVALID",
"communication timeout",
)
"""Indicates if a magnet is equipped *and* controlled by the Triton."""

self.time: Parameter = self.add_parameter(
Expand Down
Loading
Loading