diff --git a/docs/changes/newsfragments/7606.improved b/docs/changes/newsfragments/7606.improved new file mode 100644 index 000000000000..da0fac5bd171 --- /dev/null +++ b/docs/changes/newsfragments/7606.improved @@ -0,0 +1,3 @@ +- Improved pyvisa-sim YAMLs for Lakeshore Models 335, 336, and 372. +- Updated Lakeshore tests to use pyvisa-sim backend instead of mocked classes. +- Updated lakeshore_base.py to bypass waiting when using blocking_t in sim mode. diff --git a/src/qcodes/instrument/sims/lakeshore_model335.yaml b/src/qcodes/instrument/sims/lakeshore_model335.yaml index 1166b1560fce..07a59516173d 100644 --- a/src/qcodes/instrument/sims/lakeshore_model335.yaml +++ b/src/qcodes/instrument/sims/lakeshore_model335.yaml @@ -37,21 +37,37 @@ devices: setter: q: "INNAME A,\"{}\"" + sensor_tlimit_A: + default: "300.0" + getter: + q: "TLIMIT? A" + r: "{}" + setter: + q: "TLIMIT A,{}" + + sensor_type_A: + default: "1,0,1,0,1" + getter: + q: "INTYPE? A" + r: "{}" + setter: + q: "INTYPE A,{}" + sensor_setpoint_A: default: "100" getter: - q: "setp? A" + q: "SETP? A" r: "{}" setter: - q: "setp A,\"{}\"" + q: "SETP A,\"{}\"" sensor_range_A: default: "1" getter: - q: "range? A" + q: "RANGE? A" r: "{}" setter: - q: "range A,\"{}\"" + q: "RANGE A,\"{}\"" temperature_B: @@ -80,21 +96,157 @@ devices: setter: q: "INNAME B,\"{}\"" + sensor_tlimit_B: + default: "300.0" + getter: + q: "TLIMIT? B" + r: "{}" + setter: + q: "TLIMIT B,{}" + + sensor_type_B: + default: "1,0,1,0,1" + getter: + q: "INTYPE? B" + r: "{}" + setter: + q: "INTYPE B,{}" + sensor_setpoint_B: default: "100" getter: - q: "setp? A" + q: "SETP? B" r: "{}" setter: - q: "setp A,\"{}\"" + q: "SETP B,\"{}\"" sensor_range_B: default: "1" getter: - q: "range? A" + q: "RANGE? B" + r: "{}" + setter: + q: "RANGE B,\"{}\"" + + output_mode_1: + default: "1,1,0" + getter: + q: "OUTMODE? 1" + r: "{}" + setter: + q: "OUTMODE 1,{}" + + output_mode_2: + default: "1,2,0" + getter: + q: "OUTMODE? 2" + r: "{}" + setter: + q: "OUTMODE 2,{}" + + pid_output_1: + default: "10,20,30" + getter: + q: "PID? 1" + r: "{}" + setter: + q: "PID 1,{}" + + pid_output_2: + default: "10,20,30" + getter: + q: "PID? 2" + r: "{}" + setter: + q: "PID 2,{}" + + output_range_1: + default: "1" + getter: + q: "RANGE? 1" + r: "{}" + setter: + q: "RANGE 1,{}" + + output_range_2: + default: "1" + getter: + q: "RANGE? 2" + r: "{}" + setter: + q: "RANGE 2,{}" + + heater_output_1: + default: "0.0" + getter: + q: "HTR? 1" + r: "{}" + + heater_output_2: + default: "0.0" + getter: + q: "HTR? 2" + r: "{}" + + output_setpoint_1: + default: "100.0" + getter: + q: "SETP? 1" + r: "{}" + setter: + q: "SETP 1,{}" + + output_setpoint_2: + default: "100.0" + getter: + q: "SETP? 2" r: "{}" setter: - q: "range A,\"{}\"" + q: "SETP 2,{}" + + heater_setup_1: + default: "0,1,0,0.0,1" + getter: + q: "HTRSET? 1" + r: "{}" + setter: + q: "HTRSET 1,{}" + + heater_setup_2: + default: "0,1,0,0.0,1" + getter: + q: "HTRSET? 2" + r: "{}" + setter: + q: "HTRSET 2,{}" + + setpoint_ramp_1: + default: "0,0.0" + getter: + q: "RAMP? 1" + r: "{}" + setter: + q: "RAMP 1,{}" + + setpoint_ramp_2: + default: "0,0.0" + getter: + q: "RAMP? 2" + r: "{}" + setter: + q: "RAMP 2,{}" + + setpoint_ramp_status_1: + default: "0" + getter: + q: "RAMPST? 1" + r: "{}" + + setpoint_ramp_status_2: + default: "0" + getter: + q: "RAMPST? 2" + r: "{}" resources: diff --git a/src/qcodes/instrument/sims/lakeshore_model336.yaml b/src/qcodes/instrument/sims/lakeshore_model336.yaml index 1e0277c31b16..fbeca651a23c 100644 --- a/src/qcodes/instrument/sims/lakeshore_model336.yaml +++ b/src/qcodes/instrument/sims/lakeshore_model336.yaml @@ -37,21 +37,21 @@ devices: setter: q: "INNAME A,\"{}\"" - sensor_setpoint_A: - default: "100" + sensor_tlimit_A: + default: 0 getter: - q: "setp? A" + q: "TLIMIT? A" r: "{}" setter: - q: "setp A,\"{}\"" + q: "TLIMIT A,{}" - sensor_range_A: - default: "1" + sensor_intype_A: + default: "0,0,1,0,1" getter: - q: "range? A" + q: "INTYPE? A" r: "{}" setter: - q: "range A,\"{}\"" + q: "INTYPE A,{}" sensor_curve_number_A: default: 42 @@ -91,21 +91,21 @@ devices: setter: q: "INNAME B,\"{}\"" - sensor_setpoint_B: - default: "100" + sensor_tlimit_B: + default: 0 getter: - q: "setp? A" + q: "TLIMIT? B" r: "{}" setter: - q: "setp A,\"{}\"" + q: "TLIMIT B,{}" - sensor_range_B: - default: "1" + sensor_intype_B: + default: "0,0,1,0,1" getter: - q: "range? A" + q: "INTYPE? B" r: "{}" setter: - q: "range A,\"{}\"" + q: "INTYPE B,{}" sensor_curve_number_B: default: 41 @@ -144,21 +144,21 @@ devices: setter: q: "INNAME C,\"{}\"" - sensor_setpoint_C: - default: "100" + sensor_tlimit_C: + default: 0 getter: - q: "setp? A" + q: "TLIMIT? C" r: "{}" setter: - q: "setp A,\"{}\"" + q: "TLIMIT C,{}" - sensor_range_C: - default: "1" + sensor_intype_C: + default: "0,0,1,0,1" getter: - q: "range? A" + q: "INTYPE? C" r: "{}" setter: - q: "range A,\"{}\"" + q: "INTYPE C,{}" sensor_curve_number_C: default: 40 @@ -197,21 +197,21 @@ devices: setter: q: "INNAME D,\"{}\"" - sensor_setpoint_D: - default: "100" + sensor_tlimit_D: + default: 0 getter: - q: "setp? A" + q: "TLIMIT? D" r: "{}" setter: - q: "setp A,\"{}\"" + q: "TLIMIT D,{}" - sensor_range_D: - default: "1" + sensor_intype_D: + default: "0,0,1,0,1" getter: - q: "range? A" + q: "INTYPE? D" r: "{}" setter: - q: "range A,\"{}\"" + q: "INTYPE D,{}" sensor_curve_number_D: default: 39 @@ -224,6 +224,219 @@ devices: q: "CRVHDR? 39" r: "DT-039,01110039,2,339.0,1" + pid_output_1: + default: "10,20,30" + getter: + q: "PID? 1" + r: "{}" + setter: + q: "PID 1,{}" + + pid_output_2: + default: "10,20,30" + getter: + q: "PID? 2" + r: "{}" + setter: + q: "PID 2,{}" + + outmode_output_1: + default: "1,2,0" + getter: + q: "OUTMODE? 1" + r: "{}" + setter: + q: "OUTMODE 1, {}" + + outmode_output_2: + default: "1,1,0" + getter: + q: "OUTMODE? 2" + r: "{}" + setter: + q: "OUTMODE 2, {}" + + range_output_1: + default: 1 + getter: + q: "RANGE? 1" + r: "{}" + setter: + q: "RANGE 1,{}" + + range_output_2: + default: 1 + getter: + q: "RANGE? 2" + r: "{}" + setter: + q: "RANGE 2,{}" + + setpoint_output_1: + default: 0 + getter: + q: "SETP? 1" + r: "{}" + setter: + q: "SETP 1,{}" + + setpoint_output_2: + default: 0 + getter: + q: "SETP? 2" + r: "{}" + setter: + q: "SETP 2,{}" + + htr_output_1: + default: 0.005 + getter: + q: "HTR? 1" + r: "{}" + + htr_output_2: + default: 0.005 + getter: + q: "HTR? 2" + r: "{}" + + htrset_output_1: + default: "1, 5" + getter: + q: "HTRSET? 1" + r: "{}" + setter: + q: "HTRSET 1, {}" + + htrset_output_2: + default: "1, 5" + getter: + q: "HTRSET? 2" + r: "{}" + setter: + q: "HTRSET 2, {}" + + ramp_output_1: + default: "0,0" + getter: + q: "RAMP? 1" + r: "{}" + setter: + q: "RAMP 1,{}" + + ramp_output_2: + default: "0,0" + getter: + q: "RAMP? 2" + r: "{}" + setter: + q: "RAMP 2,{}" + + rampst_output_1: + default: 0 + getter: + q: "RAMPST? 1" + r: "{}" + + rampst_output_2: + default: 0 + getter: + q: "RAMPST? 2" + r: "{}" + + # ==================== + # Output 3 (Voltage Source, no PID) + # ==================== + outmode_output_3: + default: "1,1,0" + getter: + q: "OUTMODE? 3" + r: "{}" + setter: + q: "OUTMODE 3, {}" + + range_output_3: + default: 1 + getter: + q: "RANGE? 3" + r: "{}" + setter: + q: "RANGE 3,{}" + + setpoint_output_3: + default: 0 + getter: + q: "SETP? 3" + r: "{}" + setter: + q: "SETP 3,{}" + + htr_output_3: + default: 0 + getter: + q: "HTR? 3" + r: "{}" + + ramp_output_3: + default: "0,0" + getter: + q: "RAMP? 3" + r: "{}" + setter: + q: "RAMP 3,{}" + + rampst_output_3: + default: 0 + getter: + q: "RAMPST? 3" + r: "{}" + + # ==================== + # Output 4 (Voltage Source, no PID) + # ==================== + outmode_output_4: + default: "1,2,0" + getter: + q: "OUTMODE? 4" + r: "{}" + setter: + q: "OUTMODE 4, {}" + + range_output_4: + default: 1 + getter: + q: "RANGE? 4" + r: "{}" + setter: + q: "RANGE 4,{}" + + setpoint_output_4: + default: 0 + getter: + q: "SETP? 4" + r: "{}" + setter: + q: "SETP 4,{}" + + htr_output_4: + default: 0 + getter: + q: "HTR? 4" + r: "{}" + + ramp_output_4: + default: "0,0" + getter: + q: "RAMP? 4" + r: "{}" + setter: + q: "RAMP 4,{}" + + rampst_output_4: + default: 0 + getter: + q: "RAMPST? 4" + r: "{}" resources: GPIB::2::INSTR: diff --git a/src/qcodes/instrument/sims/lakeshore_model372.yaml b/src/qcodes/instrument/sims/lakeshore_model372.yaml index 050c952da2e9..c3ac32028010 100644 --- a/src/qcodes/instrument/sims/lakeshore_model372.yaml +++ b/src/qcodes/instrument/sims/lakeshore_model372.yaml @@ -1,14 +1,972 @@ spec: "1.0" + devices: device 1: eom: GPIB INSTR: q: "\r\n" r: "\r\n" - error: ERROR + error: + command error: CMD_ERROR + query error: Q_ERROR + dialogues: - q: "*IDN?" - r: "QCoDeS, m0d3l, 336, 0.0.01" + r: "QCoDeS, m0d3l, 372, 0.0.01" + + properties: + # ==================== + # Sensor Channel 1 (ch01) + # ==================== + temperature_1: + default: 4.0 + getter: + q: "KRDG? 1" + r: "{}" + + sensor_raw_1: + default: 100.0 + getter: + q: "SRDG? 1" + r: "{}" + + sensor_status_1: + default: 0 + getter: + q: "RDGST? 1" + r: "{}" + + sensor_name_1: + default: "Channel 1" + getter: + q: "INNAME? 1" + r: "{}" + setter: + q: "INNAME 1,\"{}\"" + + sensor_tlimit_1: + default: 300.0 + getter: + q: "TLIMIT? 1" + r: "{}" + setter: + q: "TLIMIT 1,{}" + + inset_1: + default: "1,100,3,0,1" + getter: + q: "INSET? 1" + r: "{}" + setter: + q: "INSET 1,{}" + + intype_1: + default: "0,1,0,5,0,1" + getter: + q: "INTYPE? 1" + r: "{}" + setter: + q: "INTYPE 1,{}" + + # ==================== + # Sensor Channel 2 (ch02) + # ==================== + temperature_2: + default: 4.0 + getter: + q: "KRDG? 2" + r: "{}" + + sensor_raw_2: + default: 100.0 + getter: + q: "SRDG? 2" + r: "{}" + + sensor_status_2: + default: 0 + getter: + q: "RDGST? 2" + r: "{}" + + sensor_name_2: + default: "Channel 2" + getter: + q: "INNAME? 2" + r: "{}" + setter: + q: "INNAME 2,\"{}\"" + + sensor_tlimit_2: + default: 300.0 + getter: + q: "TLIMIT? 2" + r: "{}" + setter: + q: "TLIMIT 2,{}" + + inset_2: + default: "1,100,3,0,1" + getter: + q: "INSET? 2" + r: "{}" + setter: + q: "INSET 2,{}" + + intype_2: + default: "0,1,0,5,0,1" + getter: + q: "INTYPE? 2" + r: "{}" + setter: + q: "INTYPE 2,{}" + + # ==================== + # Sensor Channel 3 (ch03) + # ==================== + temperature_3: + default: 4.0 + getter: + q: "KRDG? 3" + r: "{}" + + sensor_raw_3: + default: 100.0 + getter: + q: "SRDG? 3" + r: "{}" + + sensor_status_3: + default: 0 + getter: + q: "RDGST? 3" + r: "{}" + + sensor_name_3: + default: "Channel 3" + getter: + q: "INNAME? 3" + r: "{}" + setter: + q: "INNAME 3,\"{}\"" + + sensor_tlimit_3: + default: 300.0 + getter: + q: "TLIMIT? 3" + r: "{}" + setter: + q: "TLIMIT 3,{}" + + inset_3: + default: "1,100,3,0,1" + getter: + q: "INSET? 3" + r: "{}" + setter: + q: "INSET 3,{}" + + intype_3: + default: "0,1,0,5,0,1" + getter: + q: "INTYPE? 3" + r: "{}" + setter: + q: "INTYPE 3,{}" + + # ==================== + # Sensor Channel 4 (ch04) + # ==================== + temperature_4: + default: 4.0 + getter: + q: "KRDG? 4" + r: "{}" + + sensor_raw_4: + default: 100.0 + getter: + q: "SRDG? 4" + r: "{}" + + sensor_status_4: + default: 0 + getter: + q: "RDGST? 4" + r: "{}" + + sensor_name_4: + default: "Channel 4" + getter: + q: "INNAME? 4" + r: "{}" + setter: + q: "INNAME 4,\"{}\"" + + sensor_tlimit_4: + default: 300.0 + getter: + q: "TLIMIT? 4" + r: "{}" + setter: + q: "TLIMIT 4,{}" + + inset_4: + default: "1,100,3,0,1" + getter: + q: "INSET? 4" + r: "{}" + setter: + q: "INSET 4,{}" + + intype_4: + default: "0,1,0,5,0,1" + getter: + q: "INTYPE? 4" + r: "{}" + setter: + q: "INTYPE 4,{}" + + # ==================== + # Sensor Channel 5 (ch05) + # ==================== + temperature_5: + default: 4.0 + getter: + q: "KRDG? 5" + r: "{}" + + sensor_raw_5: + default: 100.0 + getter: + q: "SRDG? 5" + r: "{}" + + sensor_status_5: + default: 0 + getter: + q: "RDGST? 5" + r: "{}" + + sensor_name_5: + default: "Channel 5" + getter: + q: "INNAME? 5" + r: "{}" + setter: + q: "INNAME 5,\"{}\"" + + sensor_tlimit_5: + default: 300.0 + getter: + q: "TLIMIT? 5" + r: "{}" + setter: + q: "TLIMIT 5,{}" + + inset_5: + default: "1,100,3,0,1" + getter: + q: "INSET? 5" + r: "{}" + setter: + q: "INSET 5,{}" + + intype_5: + default: "0,1,0,5,0,1" + getter: + q: "INTYPE? 5" + r: "{}" + setter: + q: "INTYPE 5,{}" + + # ==================== + # Sensor Channel 6 (ch06) + # ==================== + temperature_6: + default: 4.0 + getter: + q: "KRDG? 6" + r: "{}" + + sensor_raw_6: + default: 100.0 + getter: + q: "SRDG? 6" + r: "{}" + + sensor_status_6: + default: 0 + getter: + q: "RDGST? 6" + r: "{}" + + sensor_name_6: + default: "Channel 6" + getter: + q: "INNAME? 6" + r: "{}" + setter: + q: "INNAME 6,\"{}\"" + + sensor_tlimit_6: + default: 300.0 + getter: + q: "TLIMIT? 6" + r: "{}" + setter: + q: "TLIMIT 6,{}" + + inset_6: + default: "1,100,3,0,1" + getter: + q: "INSET? 6" + r: "{}" + setter: + q: "INSET 6,{}" + + intype_6: + default: "0,1,0,5,0,1" + getter: + q: "INTYPE? 6" + r: "{}" + setter: + q: "INTYPE 6,{}" + + # ==================== + # Sensor Channel 7 (ch07) + # ==================== + temperature_7: + default: 4.0 + getter: + q: "KRDG? 7" + r: "{}" + + sensor_raw_7: + default: 100.0 + getter: + q: "SRDG? 7" + r: "{}" + + sensor_status_7: + default: 0 + getter: + q: "RDGST? 7" + r: "{}" + + sensor_name_7: + default: "Channel 7" + getter: + q: "INNAME? 7" + r: "{}" + setter: + q: "INNAME 7,\"{}\"" + + sensor_tlimit_7: + default: 300.0 + getter: + q: "TLIMIT? 7" + r: "{}" + setter: + q: "TLIMIT 7,{}" + + inset_7: + default: "1,100,3,0,1" + getter: + q: "INSET? 7" + r: "{}" + setter: + q: "INSET 7,{}" + + intype_7: + default: "0,1,0,5,0,1" + getter: + q: "INTYPE? 7" + r: "{}" + setter: + q: "INTYPE 7,{}" + + # ==================== + # Sensor Channel 8 (ch08) + # ==================== + temperature_8: + default: 4.0 + getter: + q: "KRDG? 8" + r: "{}" + + sensor_raw_8: + default: 100.0 + getter: + q: "SRDG? 8" + r: "{}" + + sensor_status_8: + default: 0 + getter: + q: "RDGST? 8" + r: "{}" + + sensor_name_8: + default: "Channel 8" + getter: + q: "INNAME? 8" + r: "{}" + setter: + q: "INNAME 8,\"{}\"" + + sensor_tlimit_8: + default: 300.0 + getter: + q: "TLIMIT? 8" + r: "{}" + setter: + q: "TLIMIT 8,{}" + + inset_8: + default: "1,100,3,0,1" + getter: + q: "INSET? 8" + r: "{}" + setter: + q: "INSET 8,{}" + + intype_8: + default: "0,1,0,5,0,1" + getter: + q: "INTYPE? 8" + r: "{}" + setter: + q: "INTYPE 8,{}" + + # ==================== + # Sensor Channel 9 (ch09) + # ==================== + temperature_9: + default: 4.0 + getter: + q: "KRDG? 9" + r: "{}" + + sensor_raw_9: + default: 100.0 + getter: + q: "SRDG? 9" + r: "{}" + + sensor_status_9: + default: 0 + getter: + q: "RDGST? 9" + r: "{}" + + sensor_name_9: + default: "Channel 9" + getter: + q: "INNAME? 9" + r: "{}" + setter: + q: "INNAME 9,\"{}\"" + + sensor_tlimit_9: + default: 300.0 + getter: + q: "TLIMIT? 9" + r: "{}" + setter: + q: "TLIMIT 9,{}" + + inset_9: + default: "1,100,3,0,1" + getter: + q: "INSET? 9" + r: "{}" + setter: + q: "INSET 9,{}" + + intype_9: + default: "0,1,0,5,0,1" + getter: + q: "INTYPE? 9" + r: "{}" + setter: + q: "INTYPE 9,{}" + + # ==================== + # Sensor Channel 10 (ch10) + # ==================== + temperature_10: + default: 4.0 + getter: + q: "KRDG? 10" + r: "{}" + + sensor_raw_10: + default: 100.0 + getter: + q: "SRDG? 10" + r: "{}" + + sensor_status_10: + default: 0 + getter: + q: "RDGST? 10" + r: "{}" + + sensor_name_10: + default: "Channel 10" + getter: + q: "INNAME? 10" + r: "{}" + setter: + q: "INNAME 10,\"{}\"" + + sensor_tlimit_10: + default: 300.0 + getter: + q: "TLIMIT? 10" + r: "{}" + setter: + q: "TLIMIT 10,{}" + + inset_10: + default: "1,100,3,0,1" + getter: + q: "INSET? 10" + r: "{}" + setter: + q: "INSET 10,{}" + + intype_10: + default: "0,1,0,5,0,1" + getter: + q: "INTYPE? 10" + r: "{}" + setter: + q: "INTYPE 10,{}" + + # ==================== + # Sensor Channel 11 (ch11) + # ==================== + temperature_11: + default: 4.0 + getter: + q: "KRDG? 11" + r: "{}" + + sensor_raw_11: + default: 100.0 + getter: + q: "SRDG? 11" + r: "{}" + + sensor_status_11: + default: 0 + getter: + q: "RDGST? 11" + r: "{}" + + sensor_name_11: + default: "Channel 11" + getter: + q: "INNAME? 11" + r: "{}" + setter: + q: "INNAME 11,\"{}\"" + + sensor_tlimit_11: + default: 300.0 + getter: + q: "TLIMIT? 11" + r: "{}" + setter: + q: "TLIMIT 11,{}" + + inset_11: + default: "1,100,3,0,1" + getter: + q: "INSET? 11" + r: "{}" + setter: + q: "INSET 11,{}" + + intype_11: + default: "0,1,0,5,0,1" + getter: + q: "INTYPE? 11" + r: "{}" + setter: + q: "INTYPE 11,{}" + + # ==================== + # Sensor Channel 12 (ch12) + # ==================== + temperature_12: + default: 4.0 + getter: + q: "KRDG? 12" + r: "{}" + + sensor_raw_12: + default: 100.0 + getter: + q: "SRDG? 12" + r: "{}" + + sensor_status_12: + default: 0 + getter: + q: "RDGST? 12" + r: "{}" + + sensor_name_12: + default: "Channel 12" + getter: + q: "INNAME? 12" + r: "{}" + setter: + q: "INNAME 12,\"{}\"" + + sensor_tlimit_12: + default: 300.0 + getter: + q: "TLIMIT? 12" + r: "{}" + setter: + q: "TLIMIT 12,{}" + + inset_12: + default: "1,100,3,0,1" + getter: + q: "INSET? 12" + r: "{}" + setter: + q: "INSET 12,{}" + + intype_12: + default: "0,1,0,5,0,1" + getter: + q: "INTYPE? 12" + r: "{}" + setter: + q: "INTYPE 12,{}" + + # ==================== + # Sensor Channel 13 (ch13) + # ==================== + temperature_13: + default: 4.0 + getter: + q: "KRDG? 13" + r: "{}" + + sensor_raw_13: + default: 100.0 + getter: + q: "SRDG? 13" + r: "{}" + + sensor_status_13: + default: 0 + getter: + q: "RDGST? 13" + r: "{}" + + sensor_name_13: + default: "Channel 13" + getter: + q: "INNAME? 13" + r: "{}" + setter: + q: "INNAME 13,\"{}\"" + + sensor_tlimit_13: + default: 300.0 + getter: + q: "TLIMIT? 13" + r: "{}" + setter: + q: "TLIMIT 13,{}" + + inset_13: + default: "1,100,3,0,1" + getter: + q: "INSET? 13" + r: "{}" + setter: + q: "INSET 13,{}" + + intype_13: + default: "0,1,0,5,0,1" + getter: + q: "INTYPE? 13" + r: "{}" + setter: + q: "INTYPE 13,{}" + + # ==================== + # Sensor Channel 14 (ch14) + # ==================== + temperature_14: + default: 4.0 + getter: + q: "KRDG? 14" + r: "{}" + + sensor_raw_14: + default: 100.0 + getter: + q: "SRDG? 14" + r: "{}" + + sensor_status_14: + default: 0 + getter: + q: "RDGST? 14" + r: "{}" + + sensor_name_14: + default: "Channel 14" + getter: + q: "INNAME? 14" + r: "{}" + setter: + q: "INNAME 14,\"{}\"" + + sensor_tlimit_14: + default: 300.0 + getter: + q: "TLIMIT? 14" + r: "{}" + setter: + q: "TLIMIT 14,{}" + + inset_14: + default: "1,100,3,0,1" + getter: + q: "INSET? 14" + r: "{}" + setter: + q: "INSET 14,{}" + + intype_14: + default: "0,1,0,5,0,1" + getter: + q: "INTYPE? 14" + r: "{}" + setter: + q: "INTYPE 14,{}" + + # ==================== + # Sensor Channel 15 (ch15) + # ==================== + temperature_15: + default: 4.0 + getter: + q: "KRDG? 15" + r: "{}" + + sensor_raw_15: + default: 100.0 + getter: + q: "SRDG? 15" + r: "{}" + + sensor_status_15: + default: 0 + getter: + q: "RDGST? 15" + r: "{}" + + sensor_name_15: + default: "Channel 15" + getter: + q: "INNAME? 15" + r: "{}" + setter: + q: "INNAME 15,\"{}\"" + + sensor_tlimit_15: + default: 300.0 + getter: + q: "TLIMIT? 15" + r: "{}" + setter: + q: "TLIMIT 15,{}" + + inset_15: + default: "1,100,3,0,1" + getter: + q: "INSET? 15" + r: "{}" + setter: + q: "INSET 15,{}" + + intype_15: + default: "0,1,0,5,0,1" + getter: + q: "INTYPE? 15" + r: "{}" + setter: + q: "INTYPE 15,{}" + + # ==================== + # Sensor Channel 16 (ch16) + # ==================== + temperature_16: + default: 4.0 + getter: + q: "KRDG? 16" + r: "{}" + + sensor_raw_16: + default: 100.0 + getter: + q: "SRDG? 16" + r: "{}" + + sensor_status_16: + default: 0 + getter: + q: "RDGST? 16" + r: "{}" + + sensor_name_16: + default: "Channel 16" + getter: + q: "INNAME? 16" + r: "{}" + setter: + q: "INNAME 16,\"{}\"" + + sensor_tlimit_16: + default: 300.0 + getter: + q: "TLIMIT? 16" + r: "{}" + setter: + q: "TLIMIT 16,{}" + + inset_16: + default: "1,100,3,0,1" + getter: + q: "INSET? 16" + r: "{}" + setter: + q: "INSET 16,{}" + + intype_16: + default: "0,1,0,5,0,1" + getter: + q: "INTYPE? 16" + r: "{}" + setter: + q: "INTYPE 16,{}" + + # ==================== + # Heater Output 0 (sample_heater) + # ==================== + outmode_output_0: + default: "5,2,0,0,0,1" + getter: + q: "OUTMODE? 0" + r: "{}" + setter: + q: "OUTMODE 0,{}" + + pid_output_0: + default: "10,20,30" + getter: + q: "PID? 0" + r: "{}" + setter: + q: "PID 0,{}" + + range_output_0: + default: 0 + getter: + q: "RANGE? 0" + r: "{}" + setter: + q: "RANGE 0,{}" + + setpoint_output_0: + default: 4.0 + getter: + q: "SETP? 0" + r: "{}" + setter: + q: "SETP 0,{}" + + # ==================== + # Heater Output 1 (warmup_heater) + # ==================== + outmode_output_1: + default: "5,2,0,0,0,1" + getter: + q: "OUTMODE? 1" + r: "{}" + setter: + q: "OUTMODE 1,{}" + + pid_output_1: + default: "1,2,3" + getter: + q: "PID? 1" + r: "{}" + setter: + q: "PID 1,{}" + + range_output_1: + default: 0 + getter: + q: "RANGE? 1" + r: "{}" + setter: + q: "RANGE 1,{}" + + setpoint_output_1: + default: 4.0 + getter: + q: "SETP? 1" + r: "{}" + setter: + q: "SETP 1,{}" + + # ==================== + # Heater Output 2 (analog_heater) + # ==================== + outmode_output_2: + default: "5,2,0,0,0,1" + getter: + q: "OUTMODE? 2" + r: "{}" + setter: + q: "OUTMODE 2,{}" + + pid_output_2: + default: "10,20,30" + getter: + q: "PID? 2" + r: "{}" + setter: + q: "PID 2,{}" + + range_output_2: + default: 0 + getter: + q: "RANGE? 2" + r: "{}" + setter: + q: "RANGE 2,{}" + + setpoint_output_2: + default: 4.0 + getter: + q: "SETP? 2" + r: "{}" + setter: + q: "SETP 2,{}" resources: GPIB::3::INSTR: diff --git a/src/qcodes/instrument_drivers/Lakeshore/Lakeshore_model_336.py b/src/qcodes/instrument_drivers/Lakeshore/Lakeshore_model_336.py index 977e04adec0f..509c087608e9 100644 --- a/src/qcodes/instrument_drivers/Lakeshore/Lakeshore_model_336.py +++ b/src/qcodes/instrument_drivers/Lakeshore/Lakeshore_model_336.py @@ -85,6 +85,10 @@ class LakeshoreModel336VoltageSource(LakeshoreBaseOutput): RANGES: ClassVar[dict[str, int]] = {"off": 0, "low": 1, "medium": 2, "high": 3} + _input_channel_parameter_kwargs: ClassVar[dict[str, dict[str, int]]] = { + "val_mapping": _channel_name_to_outmode_command_map + } + def __init__( self, parent: "LakeshoreModel336", diff --git a/tests/drivers/test_lakeshore_335.py b/tests/drivers/test_lakeshore_335.py index 0120707befa9..d676bd15efb1 100644 --- a/tests/drivers/test_lakeshore_335.py +++ b/tests/drivers/test_lakeshore_335.py @@ -7,10 +7,8 @@ from .test_lakeshore_372 import ( DictClass, MockVisaInstrument, - command, instrument_fixture, query, - split_args, ) log = logging.getLogger(__name__) @@ -82,91 +80,6 @@ def get_t_when_heating(self): # start at 7K. return max(4, 7 - delta) - @query("PID?") - def pidq(self, arg): - heater = self.heaters[arg] - return f"{heater.P},{heater.I},{heater.D}" - - @command("PID") - @split_args() - def pid(self, output, P, I, D): # noqa E741 - for a, v in zip(["P", "I", "D"], [P, I, D]): - setattr(self.heaters[output], a, v) - - @query("OUTMODE?") - def outmodeq(self, arg): - heater = self.heaters[arg] - return f"{heater.mode},{heater.input_channel},{heater.powerup_enable}" - - @command("OUTMODE") - @split_args() - def outputmode(self, output, mode, input_channel, powerup_enable): - h = self.heaters[output] - h.output = output - h.mode = mode - h.input_channel = input_channel - h.powerup_enable = powerup_enable - - @query("INTYPE?") - def intypeq(self, channel): - ch = self.channel_mock[channel] - return ( - f"{ch.sensor_type}," - f"{ch.auto_range_enabled},{ch.range}," - f"{ch.compensation_enabled},{ch.units}" - ) - - @command("INTYPE") - @split_args() - def intype( - self, - channel, - sensor_type, - auto_range_enabled, - range_, - compensation_enabled, - units, - ): - ch = self.channel_mock[channel] - ch.sensor_type = sensor_type - ch.auto_range_enabled = auto_range_enabled - ch.range = range_ - ch.compensation_enabled = compensation_enabled - ch.units = units - - @query("RANGE?") - def rangeq(self, heater): - h = self.heaters[heater] - return f"{h.output_range}" - - @command("RANGE") - @split_args() - def range_cmd(self, heater, output_range): - h = self.heaters[heater] - h.output_range = output_range - - @query("SETP?") - def setpointq(self, heater): - h = self.heaters[heater] - return f"{h.setpoint}" - - @command("SETP") - @split_args() - def setpoint(self, heater, setpoint): - h = self.heaters[heater] - h.setpoint = setpoint - - @query("TLIMIT?") - def tlimitq(self, channel): - chan = self.channel_mock[channel] - return f"{chan.tlimit}" - - @command("TLIMIT") - @split_args() - def tlimitcmd(self, channel, tlimit): - chan = self.channel_mock[channel] - chan.tlimit = tlimit - @query("KRDG?") def temperature(self, output): chan = self.channel_mock[output] diff --git a/tests/drivers/test_lakeshore_336.py b/tests/drivers/test_lakeshore_336.py index 0ba20e47b295..e7923c1010b7 100644 --- a/tests/drivers/test_lakeshore_336.py +++ b/tests/drivers/test_lakeshore_336.py @@ -1,16 +1,16 @@ import logging import time +import pytest + from qcodes.instrument import InstrumentBase from qcodes.instrument_drivers.Lakeshore import LakeshoreModel336 from .test_lakeshore_372 import ( DictClass, MockVisaInstrument, - command, instrument_fixture, query, - split_args, ) log = logging.getLogger(__name__) @@ -102,91 +102,6 @@ def get_t_when_heating(self): # start at 7K. return max(4, 7 - delta) - @query("PID?") - def pidq(self, arg): - heater = self.heaters[arg] - return f"{heater.P},{heater.I},{heater.D}" - - @command("PID") - @split_args() - def pid(self, output, P, I, D): # noqa E741 - for a, v in zip(["P", "I", "D"], [P, I, D]): - setattr(self.heaters[output], a, v) - - @query("OUTMODE?") - def outmodeq(self, arg): - heater = self.heaters[arg] - return f"{heater.mode},{heater.input_channel},{heater.powerup_enable}" - - @command("OUTMODE") - @split_args() - def outputmode(self, output, mode, input_channel, powerup_enable): - h = self.heaters[output] - h.output = output - h.mode = mode - h.input_channel = input_channel - h.powerup_enable = powerup_enable - - @query("INTYPE?") - def intypeq(self, channel): - ch = self.channel_mock[channel] - return ( - f"{ch.sensor_type}," - f"{ch.auto_range_enabled},{ch.range}," - f"{ch.compensation_enabled},{ch.units}" - ) - - @command("INTYPE") - @split_args() - def intype( - self, - channel, - sensor_type, - auto_range_enabled, - range_, - compensation_enabled, - units, - ): - ch = self.channel_mock[channel] - ch.sensor_type = sensor_type - ch.auto_range_enabled = auto_range_enabled - ch.range = range_ - ch.compensation_enabled = compensation_enabled - ch.units = units - - @query("RANGE?") - def rangeq(self, heater): - h = self.heaters[heater] - return f"{h.output_range}" - - @command("RANGE") - @split_args() - def range_cmd(self, heater, output_range): - h = self.heaters[heater] - h.output_range = output_range - - @query("SETP?") - def setpointq(self, heater): - h = self.heaters[heater] - return f"{h.setpoint}" - - @command("SETP") - @split_args() - def setpoint(self, heater, setpoint): - h = self.heaters[heater] - h.setpoint = setpoint - - @query("TLIMIT?") - def tlimitq(self, channel): - chan = self.channel_mock[channel] - return f"{chan.tlimit}" - - @command("TLIMIT") - @split_args() - def tlimitcmd(self, channel, tlimit): - chan = self.channel_mock[channel] - chan.tlimit = tlimit - @query("KRDG?") def temperature(self, output): chan = self.channel_mock[output] @@ -218,19 +133,19 @@ def test_pid_set(lakeshore_336) -> None: assert (h.P(), h.I(), h.D()) == (P, I, D) -def test_output_mode(lakeshore_336) -> None: +@pytest.mark.parametrize("output_num", [1, 2, 3, 4]) +@pytest.mark.parametrize("mode", ["off", "closed_loop", "zone", "open_loop"]) +@pytest.mark.parametrize("input_channel", ["A", "B", "C", "D"]) +def test_output_mode(lakeshore_336, output_num, mode, input_channel) -> None: ls = lakeshore_336 mode = "off" - input_channel = "A" - powerup_enable = True - outputs = [getattr(ls, f"output_{n}") for n in range(1, 5)] - for h in outputs: # a.k.a. heaters - h.mode(mode) - h.input_channel(input_channel) - h.powerup_enable(powerup_enable) - assert h.mode() == mode - assert h.input_channel() == input_channel - assert h.powerup_enable() == powerup_enable + h = getattr(ls, f"output_{output_num}") + h.mode(mode) + h.input_channel(input_channel) + h.powerup_enable(True) + assert h.mode() == mode + assert h.input_channel() == input_channel + assert h.powerup_enable() def test_range(lakeshore_336) -> None: diff --git a/tests/drivers/test_lakeshore_336_legacy.py b/tests/drivers/test_lakeshore_336_legacy.py index 3501ce2b3f5b..adef5b5e6bd6 100644 --- a/tests/drivers/test_lakeshore_336_legacy.py +++ b/tests/drivers/test_lakeshore_336_legacy.py @@ -9,10 +9,8 @@ from .test_lakeshore_372 import ( DictClass, MockVisaInstrument, - command, instrument_fixture, query, - split_args, ) log = logging.getLogger(__name__) @@ -104,91 +102,6 @@ def get_t_when_heating(self): # start at 7K. return max(4, 7 - delta) - @query("PID?") - def pidq(self, arg): - heater = self.heaters[arg] - return f"{heater.P},{heater.I},{heater.D}" - - @command("PID") - @split_args() - def pid(self, output, P, I, D): # noqa E741 - for a, v in zip(["P", "I", "D"], [P, I, D]): - setattr(self.heaters[output], a, v) - - @query("OUTMODE?") - def outmodeq(self, arg): - heater = self.heaters[arg] - return f"{heater.mode},{heater.input_channel},{heater.powerup_enable}" - - @command("OUTMODE") - @split_args() - def outputmode(self, output, mode, input_channel, powerup_enable): - h = self.heaters[output] - h.output = output - h.mode = mode - h.input_channel = input_channel - h.powerup_enable = powerup_enable - - @query("INTYPE?") - def intypeq(self, channel): - ch = self.channel_mock[channel] - return ( - f"{ch.sensor_type}," - f"{ch.auto_range_enabled},{ch.range}," - f"{ch.compensation_enabled},{ch.units}" - ) - - @command("INTYPE") - @split_args() - def intype( - self, - channel, - sensor_type, - auto_range_enabled, - range_, - compensation_enabled, - units, - ): - ch = self.channel_mock[channel] - ch.sensor_type = sensor_type - ch.auto_range_enabled = auto_range_enabled - ch.range = range_ - ch.compensation_enabled = compensation_enabled - ch.units = units - - @query("RANGE?") - def rangeq(self, heater): - h = self.heaters[heater] - return f"{h.output_range}" - - @command("RANGE") - @split_args() - def range_cmd(self, heater, output_range): - h = self.heaters[heater] - h.output_range = output_range - - @query("SETP?") - def setpointq(self, heater): - h = self.heaters[heater] - return f"{h.setpoint}" - - @command("SETP") - @split_args() - def setpoint(self, heater, setpoint): - h = self.heaters[heater] - h.setpoint = setpoint - - @query("TLIMIT?") - def tlimitq(self, channel): - chan = self.channel_mock[channel] - return f"{chan.tlimit}" - - @command("TLIMIT") - @split_args() - def tlimitcmd(self, channel, tlimit): - chan = self.channel_mock[channel] - chan.tlimit = tlimit - @query("KRDG?") def temperature(self, output): chan = self.channel_mock[output] diff --git a/tests/drivers/test_lakeshore_372.py b/tests/drivers/test_lakeshore_372.py index 4f59e3f3d1ae..4ebe96f40f49 100644 --- a/tests/drivers/test_lakeshore_372.py +++ b/tests/drivers/test_lakeshore_372.py @@ -4,7 +4,6 @@ import time import warnings from contextlib import suppress -from functools import wraps from typing import TYPE_CHECKING, Any, Literal, TypeVar import pytest @@ -108,18 +107,6 @@ def wrapper(func: Callable[P, T]) -> Callable[P, T]: return wrapper -def split_args(split_char: str = ","): - def wrapper(func): - @wraps(func) - def decorated_func(self, string_arg): - args = string_arg.split(split_char) - return func(self, *args) - - return decorated_func - - return wrapper - - class DictClass: def __init__(self, **kwargs): # https://stackoverflow.com/questions/16237659/python-how-to-implement-getattr @@ -220,123 +207,6 @@ def get_t_when_heating(self): # start at 7K. return max(4, 7 - delta) - @query("PID?") - def pidq(self, arg): - heater = self.heaters[arg] - return f"{heater.P},{heater.I},{heater.D}" - - @command("PID") - @split_args() - def pid(self, output, P, I, D): # noqa E741 - for a, v in zip(["P", "I", "D"], [P, I, D]): - setattr(self.heaters[output], a, v) - - @query("OUTMODE?") - def outmodeq(self, arg): - heater = self.heaters[arg] - return ( - f"{heater.mode},{heater.input_channel}," - f"{heater.powerup_enable},{heater.polarity}," - f"{heater.use_filter},{heater.delay}" - ) - - @command("OUTMODE") - @split_args() - def outputmode( - self, output, mode, input_channel, powerup_enable, polarity, use_filter, delay - ): - h = self.heaters[output] - h.output = output - h.mode = mode - h.input_channel = input_channel - h.powerup_enable = powerup_enable - h.polarity = polarity - h.use_filter = use_filter - h.delay = delay - - @query("INSET?") - def insetq(self, channel): - ch = self.channel_mock[channel] - return ( - f"{ch.enabled},{ch.dwell}," - f"{ch.pause},{ch.curve_number}," - f"{ch.temperature_coefficient}" - ) - - @command("INSET") - @split_args() - def inset( - self, channel, enabled, dwell, pause, curve_number, temperature_coefficient - ): - ch = self.channel_mock[channel] - ch.enabled = enabled - ch.dwell = dwell - ch.pause = pause - ch.curve_number = curve_number - ch.temperature_coefficient = temperature_coefficient - - @query("INTYPE?") - def intypeq(self, channel): - ch = self.channel_mock[channel] - return ( - f"{ch.excitation_mode},{ch.excitation_range_number}," - f"{ch.auto_range},{ch.range}," - f"{ch.current_source_shunted},{ch.units}" - ) - - @command("INTYPE") - @split_args() - def intype( - self, - channel, - excitation_mode, - excitation_range_number, - auto_range, - range, - current_source_shunted, - units, - ): - ch = self.channel_mock[channel] - ch.excitation_mode = excitation_mode - ch.excitation_range_number = excitation_range_number - ch.auto_range = auto_range - ch.range = range - ch.current_source_shunted = current_source_shunted - ch.units = units - - @query("RANGE?") - def rangeq(self, heater): - h = self.heaters[heater] - return f"{h.output_range}" - - @command("RANGE") - @split_args() - def range_cmd(self, heater, output_range): - h = self.heaters[heater] - h.output_range = output_range - - @query("SETP?") - def setpointq(self, heater): - h = self.heaters[heater] - return f"{h.setpoint}" - - @command("SETP") - @split_args() - def setpoint(self, heater, setpoint): - h = self.heaters[heater] - h.setpoint = setpoint - - @query("TLIMIT?") - def tlimitq(self, channel): - chan = self.channel_mock[channel] - return f"{chan.tlimit}" - - @command("TLIMIT") - @split_args() - def tlimitcmd(self, channel, tlimit): - chan = self.channel_mock[channel] - chan.tlimit = tlimit - @query("KRDG?") def temperature(self, output): chan = self.channel_mock[output]