diff --git a/src/damaris/tools/lakeshore.py b/src/damaris/tools/lakeshore.py new file mode 100644 index 0000000..0b0c8b0 --- /dev/null +++ b/src/damaris/tools/lakeshore.py @@ -0,0 +1,108 @@ +import serial +import re +import operator +import numpy as np + + +DEBUG = False + +reply_pattern = re.compile(r"\x02..(.*)\x03.", re.DOTALL) +# example answer '\x02PV279.8\x03/' +# [EOT] = \x04 +# [STX] = \x02 +# [ENQ] = \x05 +# [ETX] = \x03 +# [ACK] = \x06 +# BCC = checksum + +standard_device = '/dev/ttyUSB0' +#EOT = '\x04' +#STX = '\x02' +#ENQ = '\x05' +#ETX = '\x03' +#ACK = '\x06' +#NAK = '\x15' + + +""" +Parameter read example: + +Master: [EOT]0011PV[ENQ] +Instrument: [STX]PV16.4[ETX]{BCC} + +Writing data: + +Master: [EOT] {GID}{GID}{UID}{UID}[STX]{CHAN}(c1)(c2)[ETX](BCC) + +""" + + + +class Lakeshore(object): + def __init__(self, serial_device, baudrate=57600): + self.device = standard_device + # timeout: 110 ms to get all answers. + self.s = serial.Serial(serial_device, + baudrate=baudrate, + bytesize=7, + parity='O', + stopbits=1, + timeout=0.4) + self._expect_len = 50 + + def __del__(self): + self.s.close() + + #def get_current_temperature(self): # Temp A + # self.s.write("KRDG? a\n") + # a = self.s.readline().strip()[1:] + # return float(a) + + def get_temperature_A(self): # Temp A + self.s.write("KRDG? a\n") + a = self.s.readline().strip()[1:] + return float(a) + + def get_temperature_B(self): # Temp B + self.s.write("KRDG? b\n") + b = self.s.readline().strip()[1:] + return float(b) + + def set_temperature(self, temperature): # setze Setpoint + t = temperature + self.s.write(f"SETP 1,{t}\n") + + def set_ramp(self, ramp): + return self.s.write(f'RAMP 1, 1, {ramp}\n') + + def get_set_temperature(self): # Setpoint abfrage + self.s.write("SETP? 1\n") + s = self.s.readline().strip()[1:] + return float(s) + + def get_output(self): # Heater Output + self.s.write("HTR? 1\n") + o = self.s.readline().strip()[1:] + return float(o) + + def get_ramp(self): + self.s.write('RAMP? 1\n') + ret = self.s.readline().strip() + onoff, rate = ret.split(',') + if onoff: + return float(rate) + else: + return 0.0 + + def get_value(self, name): + temp = self.read_param(name) + if temp is None: + return np.nan + else: + try: + return float(temp) + except ValueError: + return np.nan + + def close(self): + self.s.close() \ No newline at end of file