st-ten-1/src/components/multicomp_730424.py

89 lines
3.2 KiB
Python
Raw Normal View History

2022-07-19 14:09:26 +00:00
import sys
2022-08-23 14:00:04 +00:00
if "--sim-serial" in sys.argv:
2022-07-19 14:09:26 +00:00
from components.dummies.serial import serial
else:
import serial
from .component import Component
2022-08-23 14:00:04 +00:00
class Multicomp730424(Component):
2022-09-06 15:35:49 +00:00
def __init__(self, config=None, name=None, period=1, lazy=True, paused=False, threaded=True):
2022-08-23 14:00:04 +00:00
self.conn = None
super().__init__(config=config, name=name, period=period, lazy=lazy, paused=paused, threaded=threaded)
def config_changed(self):
2022-09-21 14:33:48 +00:00
self.cable_resistance = float(self.config[self.name].get("cable_resistance", 0))
2022-08-23 14:00:04 +00:00
self.port = self.config[self.name]["port"]
self.baudrate = int(self.config[self.name]["baudrate"])
self.stopbits = getattr(serial, self.config[self.name].get("stopbits", "stopbits_one").upper())
self.parity = getattr(serial, self.config[self.name].get("parity", "parity_none").upper())
self.bytesize = getattr(serial, self.config[self.name].get("bytesize", "eightbits").upper())
2022-09-13 11:36:22 +00:00
self.read_timeout = float(self.config[self.name].get("read_timeout", 1))
self.write_timeout = float(self.config[self.name].get("write_timeout", 1))
self.inter_byte_timeout = self.config[self.name].get("inter_byte_timeout", None)
if self.inter_byte_timeout is not None:
self.inter_byte_timeout = float(self.inter_byte_timeout)
2022-08-23 14:00:04 +00:00
if self.conn is not None:
self.conn.close()
self.conn = serial.Serial(
self.port,
baudrate=self.baudrate,
stopbits=self.stopbits,
parity=self.parity,
bytesize=self.bytesize,
2022-09-13 11:36:22 +00:00
timeout=self.read_timeout,
write_timeout=self.write_timeout,
inter_byte_timeout=self.inter_byte_timeout,
2022-08-23 14:00:04 +00:00
)
2022-08-30 14:58:59 +00:00
self.write("FUNC1 \"RES\"")
2022-09-07 15:24:40 +00:00
self.write("RATE F")
self.write("AUTO 0")
if self.config[self.name]["4wire"] is "enabled":
self.write("CONF:FRES 500")
else:
self.write("CONF:RES 500")
2022-08-23 14:00:04 +00:00
2022-08-30 14:58:59 +00:00
def set_resistance_scale(self, resistance=None):
if resistance is None:
self.write("AUTO 1")
else:
self.write(f"CONF:RES {resistance}")
2022-08-23 14:00:04 +00:00
@Component.reconfig_on_error
2022-08-23 14:00:04 +00:00
def read(self):
response = self.conn.readline()
2022-08-23 14:00:04 +00:00
try:
2022-08-30 14:58:59 +00:00
decoded = response.decode("ascii", errors="ignore").strip()
2022-08-23 14:00:04 +00:00
except UnicodeDecodeError:
return response
try:
value = float(decoded)
except ValueError:
return decoded
return value
2022-07-19 14:09:26 +00:00
@Component.reconfig_on_error
2022-07-19 14:09:26 +00:00
def write(self, command):
self.conn.write(f"{command}\n".encode("ascii"))
2022-08-23 14:00:04 +00:00
@Component.reconfig_on_error
2022-08-23 14:00:04 +00:00
def _get(self):
2022-09-07 15:24:40 +00:00
self.conn.flush()
self.conn.reset_output_buffer()
self.conn.reset_input_buffer()
2022-08-23 14:00:04 +00:00
info = {}
for value_name, command in {
"function": "FUNC1?",
"scale": "RANGE?",
"measure": "MEAS1?",
}.items():
self.write(command)
info[value_name] = self.read()
2022-09-21 14:33:48 +00:00
if isinstance(info["measure"], float) and info["measure"] < 1e9:
if self.config[self.name]["4wire"] is not "enabled":
info["measure"] -= self.cable_resistance
2022-08-23 14:00:04 +00:00
self.log.debug(str(info))
super()._get([info])