diff --git a/src/qcodes/instrument/sims/CopperMountain_M5065.yaml b/src/qcodes/instrument/sims/CopperMountain_M5065.yaml index f1bfb19717b8..043cd90f449a 100644 --- a/src/qcodes/instrument/sims/CopperMountain_M5065.yaml +++ b/src/qcodes/instrument/sims/CopperMountain_M5065.yaml @@ -14,6 +14,7 @@ devices: dialogues: - q: "*IDN?" r: "CMT, M5065, 23047001, 25.3.1/2" + - q: "*RST" properties: output: default: 0 @@ -53,6 +54,16 @@ devices: specs: type: int valid: [0, 1] + averages_count: + default: 1 + getter: + q: "SENS1:AVER:COUN?" + r: "{}" + setter: + q: "SENS1:AVER:COUN {}" + specs: + type: int + min: 1 averages_trigger_enabled: default: 0 getter: @@ -77,6 +88,13 @@ devices: r: "{}" setter: q: "CALC1:CORR:EDEL:DIST {}" + electrical_distance_unit: + default: MET + getter: + q: "CALC1:CORR:EDEL:DIST:UNIT?" + r: "{}" + setter: + q: "CALC1:CORR:EDEL:DIST:UNIT {}" clock_source: default: "INT" getter: diff --git a/src/qcodes/instrument/sims/cryo4g.yaml b/src/qcodes/instrument/sims/cryo4g.yaml index 08fa46f13fbf..81496f5e72d4 100644 --- a/src/qcodes/instrument/sims/cryo4g.yaml +++ b/src/qcodes/instrument/sims/cryo4g.yaml @@ -9,48 +9,64 @@ devices: dialogues: - q: "*IDN?" r: "Cryomagnetics,4G,2239,1.02,208" - - q: "UNITS?" - r: "T" - - q: "UNITS A" - r: "" - - q: "UNITS kG" - r: "" - - q: "UNITS T" - r: "" - - q: "VMAG?" - r: "4.75" - - q: "VOUT?" - r: "12.0" - - q: "IOUT?" - r: "85.0" - - q: "QRESET" - r: "" - - q: "REMOTE" - r: "" - - q: "SWEEP ZERO" - r: "" - - q: "*STB?" - r: "0" # standby mode - q: "*STB?" - r: "1" # ramping mode - - q: "IMAG?" - r: "85.0 kG" - - q: "RATE?" - r: "5.0" - - q: "LLIM 50" - r: "" - - q: "ULIM 100" - r: "" - - q: "SWEEP UP" - r: "" - - q: "SWEEP DOWN" - r: "" - - q: "RANGE 0 100.0" - r: "" - - q: "RATE 0 1.0" - r: "" - - q: "SWEEP PAUSE" - r: "" + r: "0" + - q: "REMOTE" + properties: + unit: + default: "T" + getter: + q: "UNITS?" + r: "{}" + setter: + q: "UNITS {}" + specs: + type: str + valid: ["T", "A", "kG"] + field: + default: 0.0 + getter: + q: "IMAG?" + r: "{} kG" + setter: + q: "IMAG {}" + specs: + type: float + ramp_field_up: + default: 0.0 + setter: + q: "ULIM {}" + specs: + type: float + ramp_field_down: + default: 0.0 + setter: + q: "LLIM {}" + specs: + type: float + sweep_direction: + default: "UP" + setter: + q: "SWEEP {}" + specs: + type: str + valid: ["UP", "DOWN"] + current_limits: + range: + ids: [1, 2, 3, 4, 5, 6] + properties: + range: + default: 0.0 + setter: + q: "RANGE {range_id} {}" + specs: + type: float + rate: + default: 0.0 + setter: + q: "RATE {range_id} {}" + specs: + type: float resources: GPIB::1::INSTR: diff --git a/src/qcodes/instrument/sims/cryo_tm620.yaml b/src/qcodes/instrument/sims/cryo_tm620.yaml index fbe315f28cbd..c7527a6723ce 100644 --- a/src/qcodes/instrument/sims/cryo_tm620.yaml +++ b/src/qcodes/instrument/sims/cryo_tm620.yaml @@ -13,6 +13,7 @@ devices: r: "{RANDOM(54, 56, 1):.2f}K\r\n" - q: "MEAS? B" r: "{RANDOM(3, 5, 1):.2f}K\r\n" + - q: "REMOTE" properties: shield: diff --git a/src/qcodes/instrument_drivers/cryomagnetics/_cryomagnetics4g.py b/src/qcodes/instrument_drivers/cryomagnetics/_cryomagnetics4g.py index 6fb8c13c4184..ef31232682ef 100644 --- a/src/qcodes/instrument_drivers/cryomagnetics/_cryomagnetics4g.py +++ b/src/qcodes/instrument_drivers/cryomagnetics/_cryomagnetics4g.py @@ -263,7 +263,7 @@ def set_field( """ # Convert field setpoint to kG for the instrument - field_setpoint_kg = field_setpoint * 10 + field_setpoint_kg = field_setpoint / self.KG_TO_TESLA # Determine sweep direction based on setpoint and current field current_field = self._get_field() @@ -316,6 +316,9 @@ def wait_while_ramping( self, value: float, threshold: float = 2e-3 ) -> CryomagneticsOperatingState: """Waits while the magnet is ramping, checking the field value.""" + if getattr(self, "visabackend", False) == "sim": + # write setpoint directly in sim mode + self.write(f"IMAG {value / self.KG_TO_TESLA}") last_check_time = time.time() stability_check_interval = 20 last_stable_field = self._get_field() diff --git a/tests/drivers/test_CopperMountain_M5065.py b/tests/drivers/test_CopperMountain_M5065.py index 165ba50352a4..27cd161aba06 100644 --- a/tests/drivers/test_CopperMountain_M5065.py +++ b/tests/drivers/test_CopperMountain_M5065.py @@ -37,3 +37,56 @@ def test_idn_command(vna): def test_min_and_max_frequency_defaults(vna): assert vna.min_freq == 300e3 assert vna.max_freq == 6.5e9 + + +def test_output_param(vna): + vna.output(True) + assert vna.output() is True + vna.output(False) + assert vna.output() is False + + +def test_power_param(vna): + vna.power(-20) + assert vna.power() == -20 + + +def test_if_bandwidth_param(vna): + vna.if_bandwidth(1000) + assert vna.if_bandwidth() == 1000 + + +def test_averages_param(vna): + vna.averages(2) + assert vna.averages() == 2 + + +def test_frequency_params(vna): + vna.start(1e6) + vna.stop(2e6) + vna.center(1.5e6) + vna.span(1e6) + assert vna.start() == 1e6 + assert vna.stop() == 2e6 + assert vna.center() == 1.5e6 + assert vna.span() == 1e6 + + +def test_setting_start_raises_error_when_larger_than_stop(vna): + with pytest.raises(ValueError, match="Stop frequency"): + vna.stop(1e6) + vna.start(1e7) + + +def test_number_of_points_param(vna): + vna.number_of_points(201) + assert vna.number_of_points() == 201 + + +def test_trigger_source_param(vna): + vna.trigger_source("bus") + assert vna.trigger_source() == "bus" + + +def test_update_lin_traces(vna): + vna.update_lin_traces() diff --git a/tests/drivers/test_cryomagnetics_4g.py b/tests/drivers/test_cryomagnetics_4g.py index 1e2510aa5092..27597225eac1 100644 --- a/tests/drivers/test_cryomagnetics_4g.py +++ b/tests/drivers/test_cryomagnetics_4g.py @@ -34,8 +34,8 @@ def test_initialization(cryo_instrument): def test_get_field(cryo_instrument): cryo_instrument.units = MagicMock(return_value="T") - with patch.object(cryo_instrument, "ask", return_value="50.0 kG"): - assert cryo_instrument.field() == 5.0 + cryo_instrument.field(5.0) + assert cryo_instrument.field() == 5.0 def test_initialization_visa_sim(cryo_instrument): @@ -85,8 +85,6 @@ def test_magnet_operating_state( def test_set_field_successful(cryo_instrument, caplog): with ( patch.object(cryo_instrument, "write") as mock_write, - patch.object(cryo_instrument, "ask", return_value="2"), - patch.object(cryo_instrument, "_get_field", return_value=0), ): with caplog.at_level(logging.WARNING): cryo_instrument.set_field(0.1, block=False) @@ -102,12 +100,6 @@ def test_set_field_successful(cryo_instrument, caplog): def test_set_field_blocking(cryo_instrument): with ( patch.object(cryo_instrument, "write") as mock_write, - patch.object(cryo_instrument, "_get_field", return_value=0), - patch.object( - cryo_instrument, - "magnet_operating_state", - return_value=CryomagneticsOperatingState(holding=True, ramping=False), - ), patch.object( cryo_instrument, "wait_while_ramping", @@ -141,9 +133,7 @@ def test_wait_while_ramping_timeout(cryo_instrument): def test_wait_while_ramping_success(cryo_instrument): # Simulate _get_field returning values that reach the setpoint - field_values = [0.0, 0.2, 0.4, 0.5] # Last value matches setpoint with ( - patch.object(cryo_instrument, "_get_field", side_effect=field_values), patch.object(cryo_instrument, "_sleep"), patch.object( cryo_instrument, @@ -171,7 +161,6 @@ def test_set_rate(cryo_instrument): with ( patch.object(cryo_instrument, "write") as mock_write, - patch.object(cryo_instrument, "_get_field", return_value=0.5), ): # _set_rate() converts T/min to A/s for all ranges cryo_instrument._set_rate(1.0)