Skip to content

Commit ca2b07a

Browse files
authored
Merge pull request #416 from michaelc12qe/main
Valon: Fix VI_ERROR_INV_MASK bug when flushing buffer
2 parents 36c7f71 + 09c63a1 commit ca2b07a

File tree

1 file changed

+32
-44
lines changed

1 file changed

+32
-44
lines changed

src/qcodes_contrib_drivers/drivers/Valon/Valon_5015.py

Lines changed: 32 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
44
Please refer to Valon's 5015 Frequency Synthesizer manual for further
55
details and functionality. This model is not SCPI compliant.
6+
7+
Working with FW 2.0a
68
"""
79
import re
810
import logging
@@ -12,21 +14,19 @@
1214
from qcodes import VisaInstrument
1315
import pyvisa.constants as vi_const
1416

15-
1617
log = logging.getLogger(__name__)
1718

18-
1919
class Valon5015(VisaInstrument):
2020
"""Driver for Valon 5015 Frequency Synthesizer.
2121
2222
This driver does not contain all commands available for the Valon 5015 but
2323
only the ones most commonly used.
2424
"""
25-
__frequency_regex = re.compile(r"F (?P<frequency>\d+([.]\d+)?) MHz")
26-
__offset_regex = re.compile(r"OFFSET (?P<offset>\d+([.]\d+)?) MHz")
27-
__power_regex = re.compile(r"PWR (?P<power>\d+[.]\d+)")
28-
__modulation_db_regex = re.compile(r"AMD (?P<modulation_db>\d+[.]\d+) dB")
29-
__modulation_frequency_regex = re.compile(r"AMF (?P<modulation_frequency>\d+([.]\d+)?) kHz")
25+
__frequency_regex = re.compile(r"F (?P<frequency>-?\d+([.]\d+)?) MHz")
26+
__offset_regex = re.compile(r"OFFSET (?P<offset>-?\d+([.]\d+)?) MHz")
27+
__power_regex = re.compile(r"PWR (?P<power>-?\d+[.]\d+)")
28+
__modulation_db_regex = re.compile(r"AMD (?P<modulation_db>-?\d+[.]\d+) dB")
29+
__modulation_frequency_regex = re.compile(r"AMF (?P<modulation_frequency>-?\d+([.]\d+)?) kHz")
3030
__low_power_mode_enabled_regex = re.compile(r"PDN (?P<low_power_mode_enabled>[01])")
3131
__buffer_amplifiers_enabled_regex = re.compile(r"OEN (?P<buffer_amplifiers_enabled>[01])")
3232

@@ -58,7 +58,7 @@ def __init__(self, name: str, address: str, **kwargs: Any):
5858
unit='Hz',
5959
get_cmd=self._get_offset,
6060
set_cmd=self._set_offset,
61-
vals=Numbers(-4295e3, 4295e3),
61+
vals=Numbers(-4295e6, 4295e6),
6262
docstring="Get/set the offset to be added or substracted from the frequency. The allowed range is from -4.295 GHz to 4295 GHz and the value is expressed in Hz.")
6363

6464
self.add_parameter(name='power',
@@ -80,7 +80,7 @@ def __init__(self, name: str, address: str, **kwargs: Any):
8080
label='Modulation_Frequency',
8181
unit='Hz',
8282
get_cmd=self._get_modulation_frequency,
83-
set_cmd=self._set_modulation_frequency,
83+
set_cmd=self._set_modulation_frequency, # Doesn't appear to work
8484
vals=Numbers(1, 2e3),
8585
docstring="Get/Set the AM modulation frequency. The allowed range is from 1 Hz to 2 kHz and the value is expressed in Hz.")
8686

@@ -98,100 +98,88 @@ def __init__(self, name: str, address: str, **kwargs: Any):
9898
vals=Bool(),
9999
docstring="Enables or disables the RF output buffer amplifiers.")
100100

101+
def askv(self, cmd: str, ltr: int = 1):
102+
self._flush()
103+
self.write(cmd)
104+
return [self.visa_handle.read() for _ in range(ltr)]
105+
101106
def _get_status(self):
102-
responses = [self.ask("stat") for _ in range(14)]
107+
responses = self.askv('stat', 14)
103108
responses = "\n".join(responses[1:])
104-
self._flush()
105109
return responses
106110

107111
def _get_id(self):
108-
responses = [self.ask("id") for _ in range(2)]
112+
responses = self.askv("id", 2)
109113
responses = "\n".join(responses[1:])
110-
self._flush()
111114
return responses
112115

113116
def _set_id(self, n):
114-
self.ask(f"id {n}")
115-
self._flush()
117+
self.askv(f"id {n}")
116118

117119
def _get_frequency(self):
118-
response = [self.ask("frequency") for _ in range(2)][1]
120+
response = self.askv("frequency", 2)[1]
119121
match = self.__frequency_regex.match(response)
120122
frequency = match.group("frequency")
121-
self._flush()
122123
return float(frequency) * 1e6
123124

124125
def _set_frequency(self, frequency):
125-
self.ask(f"frequency {int(frequency)} Hz")
126-
self._flush()
126+
self.askv(f"frequency {int(frequency)} Hz")
127127

128128
def _get_offset(self):
129-
response = [self.ask("offset") for _ in range(2)][1]
129+
response = self.askv("offset", 2)[1]
130130
match = self.__offset_regex.match(response)
131131
offset = match.group("offset")
132-
self._flush()
133132
return float(offset) * 1e6
134133

135134
def _set_offset(self, offset):
136-
self.ask(f"offset {int(offset)} Hz")
137-
self._flush()
135+
self.askv(f"offset {int(offset)} Hz")
138136

139137
def _get_power(self):
140-
response = [self.ask("power") for _ in range(2)][1]
138+
response = self.askv("power", 2)[1]
141139
match = self.__power_regex.match(response)
142140
power = match.group("power")
143-
self._flush()
144141
return float(power)
145142

146143
def _set_power(self, power):
147-
self.ask(f"power {power}")
148-
self._flush()
144+
self.askv(f"power {power}")
149145

150146
def _get_modulation_db(self):
151-
response = [self.ask("amd") for _ in range(2)][1]
147+
response = self.askv("amd", 2)[1]
152148
match = self.__modulation_db_regex.match(response)
153149
modulation_db = match.group("modulation_db")
154-
self._flush()
155150
return float(modulation_db)
156151

157152
def _set_modulation_db(self, modulation_db):
158-
self.ask(f"amd {modulation_db}")
159-
self._flush()
153+
self.askv(f"amd {modulation_db}")
160154

161155
def _get_modulation_frequency(self):
162-
response = [self.ask("amf") for _ in range(2)][1]
156+
response = self.askv("amf", 2)[1]
163157
match = self.__modulation_frequency_regex.match(response)
164158
modulation_frequency = match.group("modulation_frequency")
165-
self._flush()
166159
return float(modulation_frequency) * 1e3
167160

168161
def _set_modulation_frequency(self, modulation_frequency):
169-
self.ask(f"amd {int(modulation_frequency)}")
170-
self._flush()
162+
self.askv(f"amf {int(modulation_frequency)}")
171163

172164
def _get_low_power_mode_enabled(self):
173-
response = [self.ask("pdn") for _ in range(2)][1]
165+
response = self.askv("pdn", 2)[1]
174166
match = self.__low_power_mode_enabled_regex.match(response)
175167
low_power_mode_enabled = match.group("low_power_mode_enabled")
176-
self._flush()
177168
return True if low_power_mode_enabled == "1" else False
178169

179170
def _set_low_power_mode_enabled(self, low_power_mode_enabled):
180171
low_power_mode_enabled = "1" if low_power_mode_enabled else "0"
181-
self.ask(f"pdn {low_power_mode_enabled}")
182-
self._flush()
172+
self.askv(f"pdn {low_power_mode_enabled}")
183173

184174
def _get_buffer_amplifiers_enabled(self):
185-
response = [self.ask("oen") for _ in range(2)][1]
175+
response = self.askv("oen", 2)[1]
186176
match = self.__buffer_amplifiers_enabled_regex.match(response)
187177
buffer_amplifiers_enabled = match.group("buffer_amplifiers_enabled")
188-
self._flush()
189178
return True if buffer_amplifiers_enabled == "1" else False
190179

191180
def _set_buffer_amplifiers_enabled(self, buffer_amplifiers_enabled):
192181
buffer_amplifiers_enabled = "1" if buffer_amplifiers_enabled else "0"
193-
self.ask(f"oen {buffer_amplifiers_enabled}")
194-
self._flush()
182+
self.askv(f"oen {buffer_amplifiers_enabled}")
195183

196184
def _flush(self):
197-
self.visa_handle.flush(vi_const.VI_READ_BUF | vi_const.VI_READ_BUF_DISCARD)
185+
self.visa_handle.flush(vi_const.VI_IO_IN_BUF_DISCARD)

0 commit comments

Comments
 (0)