mirror of https://github.com/m-labs/artiq.git
Lda: sanity checks on attenuation value
- Plus use of dB unit
This commit is contained in:
parent
d21211a473
commit
2ad063c377
|
@ -1,7 +1,7 @@
|
||||||
import logging
|
import logging
|
||||||
import ctypes
|
import ctypes
|
||||||
import struct
|
import struct
|
||||||
|
from artiq.language.units import dB, check_unit, Quantity
|
||||||
|
|
||||||
logger = logging.getLogger("lda")
|
logger = logging.getLogger("lda")
|
||||||
|
|
||||||
|
@ -16,6 +16,8 @@ class Ldasim:
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self._attenuation = None
|
self._attenuation = None
|
||||||
|
self._att_max = 63*dB
|
||||||
|
self._att_step_size = 0.25*dB
|
||||||
|
|
||||||
def get_attenuation(self):
|
def get_attenuation(self):
|
||||||
"""Reads last attenuation value set to the simulated device.
|
"""Reads last attenuation value set to the simulated device.
|
||||||
|
@ -34,9 +36,23 @@ class Ldasim:
|
||||||
:type attenuation: int, float or Fraction
|
:type attenuation: int, float or Fraction
|
||||||
"""
|
"""
|
||||||
|
|
||||||
attenuation = round(attenuation*4)/4.
|
if isinstance(attenuation, Quantity):
|
||||||
print("[LDA-sim] setting attenuation to {}".format(attenuation))
|
check_unit(attenuation, 'dB')
|
||||||
self._attenuation = attenuation
|
else:
|
||||||
|
att = attenuation*dB
|
||||||
|
|
||||||
|
if att > self._att_max:
|
||||||
|
raise ValueError('Cannot set attenuation {} > {}'
|
||||||
|
.format(att, self._att_max))
|
||||||
|
elif att < 0*dB:
|
||||||
|
raise ValueError('Cannot set attenuation {} < 0'.format(att))
|
||||||
|
elif att % self._att_step_size != 0*dB:
|
||||||
|
raise ValueError('Cannot set attenuation {} with step size {}'
|
||||||
|
.format(att, self._att_step_size))
|
||||||
|
else:
|
||||||
|
att = round(att.amount*4)/4. * dB
|
||||||
|
print("[LDA-sim] setting attenuation to {}".format(att))
|
||||||
|
self._attenuation = att
|
||||||
|
|
||||||
|
|
||||||
class Lda:
|
class Lda:
|
||||||
|
@ -59,6 +75,16 @@ class Lda:
|
||||||
"LDA-602": 0x1208,
|
"LDA-602": 0x1208,
|
||||||
"LDA-302P-1": 0x120E,
|
"LDA-302P-1": 0x120E,
|
||||||
}
|
}
|
||||||
|
_max_att = {
|
||||||
|
"LDA-102": 63*dB,
|
||||||
|
"LDA-602": 63*dB,
|
||||||
|
"LDA-302P-1": 63*dB
|
||||||
|
}
|
||||||
|
_att_step_size = {
|
||||||
|
"LDA-102": 0.5*dB,
|
||||||
|
"LDA-602": 0.5*dB,
|
||||||
|
"LDA-302P-1": 1.0*dB
|
||||||
|
}
|
||||||
|
|
||||||
def __init__(self, serial=None, product="LDA-102"):
|
def __init__(self, serial=None, product="LDA-102"):
|
||||||
"""
|
"""
|
||||||
|
@ -149,7 +175,7 @@ class Lda:
|
||||||
:rtype: float
|
:rtype: float
|
||||||
"""
|
"""
|
||||||
|
|
||||||
return ord(self.get(0x0d, 1))/4.
|
return (ord(self.get(0x0d, 1))/4.) * dB
|
||||||
|
|
||||||
def set_attenuation(self, attenuation):
|
def set_attenuation(self, attenuation):
|
||||||
"""Sets attenuation value of the Lab Brick device.
|
"""Sets attenuation value of the Lab Brick device.
|
||||||
|
@ -158,4 +184,18 @@ class Lda:
|
||||||
:type attenuation: int, float or Fraction
|
:type attenuation: int, float or Fraction
|
||||||
"""
|
"""
|
||||||
|
|
||||||
self.set(0x8d, bytes([int(round(attenuation*4))]))
|
if isinstance(attenuation, Quantity):
|
||||||
|
check_unit(attenuation, 'dB')
|
||||||
|
else:
|
||||||
|
att = attenuation*dB
|
||||||
|
|
||||||
|
if att > self._max_att[self.product]:
|
||||||
|
raise ValueError('Cannot set attenuation {} > {}'
|
||||||
|
.format(att, self._max_att[self.product]))
|
||||||
|
elif att < 0:
|
||||||
|
raise ValueError('Cannot set attenuation {} < 0'.format(att))
|
||||||
|
elif att % self._att_step_size[self.product] != 0:
|
||||||
|
raise ValueError('Cannot set attenuation {} with {} step size'
|
||||||
|
.format(att, self._att_step_size[self.product]))
|
||||||
|
else:
|
||||||
|
self.set(0x8d, bytes([int(round(att.amount*4))]))
|
||||||
|
|
|
@ -208,6 +208,7 @@ def _register_unit(unit, prefixes):
|
||||||
|
|
||||||
_register_unit("s", "pnum_")
|
_register_unit("s", "pnum_")
|
||||||
_register_unit("Hz", "_kMG")
|
_register_unit("Hz", "_kMG")
|
||||||
|
_register_unit("dB", "_")
|
||||||
|
|
||||||
|
|
||||||
def check_unit(value, unit):
|
def check_unit(value, unit):
|
||||||
|
|
Loading…
Reference in New Issue