forked from M-Labs/artiq
lda: add docstring
This commit is contained in:
parent
44ec3eae3d
commit
b9e7fdb80e
|
@ -71,6 +71,19 @@ class HidError(Exception):
|
||||||
|
|
||||||
|
|
||||||
class Lda:
|
class Lda:
|
||||||
|
"""Lab Brick Digital Attenuator controller.
|
||||||
|
|
||||||
|
This controller depends on the hidapi library.
|
||||||
|
|
||||||
|
On Linux you should install hidapi-libusb shared library in a directory
|
||||||
|
listed in your LD_LIBRARY_PATH or in the conventional places (/usr/lib,
|
||||||
|
/lib, /usr/local/lib). This can be done either from hidapi sources
|
||||||
|
or by installing the libhidapi-libusb0 binary package on Debian-like OS.
|
||||||
|
|
||||||
|
On Windows you should put hidapi.dll shared library in the same directory
|
||||||
|
as the controller.
|
||||||
|
|
||||||
|
"""
|
||||||
_vendor_id = 0x041f
|
_vendor_id = 0x041f
|
||||||
_product_ids = {
|
_product_ids = {
|
||||||
"LDA-102": 0x1207,
|
"LDA-102": 0x1207,
|
||||||
|
@ -78,6 +91,12 @@ class Lda:
|
||||||
}
|
}
|
||||||
|
|
||||||
def __init__(self, serial=None, product="LDA-102"):
|
def __init__(self, serial=None, product="LDA-102"):
|
||||||
|
"""
|
||||||
|
:param serial: The serial number.
|
||||||
|
:param product: The product identifier string: LDA-102, LDA-602 or sim.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
self.product = product
|
self.product = product
|
||||||
if serial is None and product != "sim":
|
if serial is None and product != "sim":
|
||||||
serial = next(self.enumerate(product))
|
serial = next(self.enumerate(product))
|
||||||
|
@ -105,12 +124,25 @@ class Lda:
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
def write(self, command, length, data=bytes()):
|
def write(self, command, length, data=bytes()):
|
||||||
|
"""Writes a command to the Lab Brick device.
|
||||||
|
|
||||||
|
:param command: command ID.
|
||||||
|
:param length: number of meaningful bytes in the data array.
|
||||||
|
:param data: a byte array containing the payload of the command.
|
||||||
|
|
||||||
|
"""
|
||||||
# 0 is report id/padding
|
# 0 is report id/padding
|
||||||
buf = struct.pack("BBB6s", 0, command, length, data)
|
buf = struct.pack("BBB6s", 0, command, length, data)
|
||||||
res = self._check_error(hidapi.hid_write(self._dev, buf, len(buf)))
|
res = self._check_error(hidapi.hid_write(self._dev, buf, len(buf)))
|
||||||
assert res == len(buf), res
|
assert res == len(buf), res
|
||||||
|
|
||||||
def set(self, command, data):
|
def set(self, command, data):
|
||||||
|
"""Sends a SET command to the Lab Brick device.
|
||||||
|
|
||||||
|
:param command: command ID, must have most significant bit set.
|
||||||
|
:param data: payload of the command.
|
||||||
|
|
||||||
|
"""
|
||||||
assert command & 0x80
|
assert command & 0x80
|
||||||
assert data
|
assert data
|
||||||
self.write(command, len(data), data)
|
self.write(command, len(data), data)
|
||||||
|
@ -118,6 +150,15 @@ class Lda:
|
||||||
def get(self, command, length, timeout=1000):
|
def get(self, command, length, timeout=1000):
|
||||||
# FIXME: this can collide with the status reports that the
|
# FIXME: this can collide with the status reports that the
|
||||||
# device sends out by itself
|
# device sends out by itself
|
||||||
|
"""Sends a GET command to read back some value of the Lab Brick device.
|
||||||
|
|
||||||
|
:param int command: Command ID, most significant bit must be cleared.
|
||||||
|
:param int length: Length of the command, "count" in the datasheet.
|
||||||
|
:param int timeout: Timeout of the HID read in ms.
|
||||||
|
:return: Returns the value read from the device.
|
||||||
|
:rtype: bytes
|
||||||
|
|
||||||
|
"""
|
||||||
assert not command & 0x80
|
assert not command & 0x80
|
||||||
self.write(command, length)
|
self.write(command, length)
|
||||||
buf = ctypes.create_string_buffer(8)
|
buf = ctypes.create_string_buffer(8)
|
||||||
|
@ -130,12 +171,24 @@ class Lda:
|
||||||
return data
|
return data
|
||||||
|
|
||||||
def get_attenuation(self):
|
def get_attenuation(self):
|
||||||
|
"""Reads attenuation value from Lab Brick device.
|
||||||
|
|
||||||
|
:return: Returns the attenuation value in dB.
|
||||||
|
:rtype: float
|
||||||
|
|
||||||
|
"""
|
||||||
if self.product != "sim":
|
if self.product != "sim":
|
||||||
return ord(self.get(0x0d, 1))/4.
|
return ord(self.get(0x0d, 1))/4.
|
||||||
else:
|
else:
|
||||||
return self._attenuation
|
return self._attenuation
|
||||||
|
|
||||||
def set_attenuation(self, attenuation):
|
def set_attenuation(self, attenuation):
|
||||||
|
"""Sets attenuation value of the Lab Brick device.
|
||||||
|
|
||||||
|
:param attenuation: Attenuation value in dB.
|
||||||
|
:type attenuation: int, float or Fraction
|
||||||
|
|
||||||
|
"""
|
||||||
if self.product != "sim":
|
if self.product != "sim":
|
||||||
self.set(0x8d, bytes(chr(int(round(attenuation*4))), 'ascii'))
|
self.set(0x8d, bytes(chr(int(round(attenuation*4))), 'ascii'))
|
||||||
else:
|
else:
|
||||||
|
|
Loading…
Reference in New Issue