fixed lakeshore to keep using the simple ASCII commands
Build Debian Packages / build (trixie, debian13) (pull_request) Successful in 14m22s
Build Debian Packages / build (bookworm, debian12) (pull_request) Successful in 14m24s
Build Debian Packages / build (bullseye, debian11) (pull_request) Has been cancelled

This commit is contained in:
2026-07-12 20:15:50 +02:00
parent 6f0b090d9d
commit 75863ffc19
+13 -53
View File
@@ -1,8 +1,6 @@
import serial
import re
import operator
import numpy as np
from functools import reduce
from .temperature import TemperatureController, register_controller
@@ -18,18 +16,7 @@ reply_pattern = re.compile(r"\x02..(.*)\x03.", re.DOTALL)
# [ACK] = \x06
# BCC = checksum
standard_device = '0011'
EOT = '\x04'
STX = '\x02'
ENQ = '\x05'
ETX = '\x03'
ACK = '\x06'
NAK = '\x15'
def checksum(message):
bcc = (reduce(operator.xor, list(map(ord,message))))
return chr(bcc)
standard_device = '/dev/ttyUSB0'
"""
@@ -104,6 +91,15 @@ class Lakeshore(TemperatureController):
else:
return 0.0
def read_param(self, param):
"""Read a parameter using simple ASCII commands."""
self.s.write(f"{param}?\n")
answer = self.s.readline().strip()
if answer and len(answer) > 1:
# Remove the first character (command echo) and return the value
return answer[1:]
return None
def get_value(self, name):
temp = self.read_param(name)
if temp is None:
@@ -114,47 +110,11 @@ class Lakeshore(TemperatureController):
except ValueError:
return np.nan
def send_read_param(self, param):
self.s.write(EOT + self.device + param + ENQ)
def read_param(self, param):
self.s.flushInput()
self.send_read_param(param)
answer = self.s.read(self._expect_len)
m = reply_pattern.search(answer)
if m is None:
# Reading _expect_len bytes was not enough...
answer += self.s.read(200)
m = reply_pattern.search(answer)
if m is not None:
self._expect_len = len(answer)
return m.group(1)
else:
print("received:", repr(answer))
return None
def write_param(self, mnemonic, data):
if len(mnemonic) > 2:
raise ValueError
bcc = checksum(mnemonic + data + ETX)
mes = EOT+self.device+STX+mnemonic+data+ETX+bcc
if DEBUG:
for i in mes:
print(i,hex(ord(i)))
self.s.flushInput()
self.s.write(mes)
answer = self.s.read(1)
# print "received:", repr(answer)
if answer == "":
# raise IOError("No answer from device")
return None
return answer[-1] == ACK
# TemperatureController interface implementation
def get_temperature(self) -> float:
"""Read current temperature in Celsius."""
temp = self.get_temperature_A()
temp = self.read_param('KRDG')
if temp is None:
return 0.0
try:
@@ -164,7 +124,7 @@ class Lakeshore(TemperatureController):
def get_setpoint(self) -> float:
"""Read target setpoint temperature in Celsius."""
temp = self.get_set_temperature()
temp = self.read_param('SETP')
if temp is None:
return 0.0
try:
@@ -174,7 +134,7 @@ class Lakeshore(TemperatureController):
def set_setpoint(self, temperature: float) -> bool:
"""Set target temperature in Celsius."""
self.set_temperature(temperature)
self.s.write(f"SETP {temperature}\n")
return True
def close(self):