frappy_psi.ValvesHP for capillary rhexometry

This commit is contained in:
2026-06-09 14:21:22 +02:00
committed by zolliker
co-authored by zolliker
parent 41c4fed14d
commit b23ecec7b0
+104
View File
@@ -0,0 +1,104 @@
from frappy.core import (Drivable, Readable, StringIO, HasIO, Writable,
FloatRange, IntRange, EnumType, Parameter, Property,
PersistentParam, Command, IDLE, BUSY, ERROR,
WARN, Attached, Module)
#import serial
#import time
#v1addr = '/dev/serial/by-id/usb-Prolific_Technology_Inc._USB-Serial_Controller_A7BVd126810-if00-port0'
#v4addr = '/dev/serial/by-id/usb-Prolific_Technology_Inc._USB-Serial_Controller_A_CFd126810-if00-port0'
#v2addr = '/dev/serial/by-id/usb-Prolific_Technology_Inc._USB-Serial_Controller_BPEAd126810-if00-port0'
#v3addr = '/dev/serial/by-id/usb-Prolific_Technology_Inc._USB-Serial_Controller_FGCFd126810-if00-port0'
class ValvesCommunication(StringIO):
end_of_line = '\r'
class SelectorValve(HasIO, Drivable):
# ioClass = ValvesCommunication
positions=Property('number of positions', IntRange(1,20), default=10)
value=Parameter('current valve position', IntRange(1,20), default=1)
target=Parameter('target valve position', IntRange(1,20), default=1, readonly=False)
status = Parameter()
# key_positions = Property('named posiitons', dict, default={"source1": 1, "source2": 2, "waste": 3})
io = Attached()
# def initModule(self):
#
# self.value.datatype = IntRange(1, self.positions)
# self.target.datatype = IntRange(1, self.positions)
def initialReads(self):
self.value = self.read_value()
self.target = self.value
self.value = IDLE
def query(self, cmd, noreply=False):
if noreply:
self.communicate(cmd, noreply)
return
else:
return self.communicate(cmd).strip()
def read_value(self):
return int(self.query("CP")[2:])
def read_status(self):
current = self.read_value()
if current == self.target:
return IDLE,"reached positon"
else:
return BUSY, "not at target"
def write_target(self, target):
#if not (1 <= target <= self.positions):
# raise ValueError("Invalid position")
# return self.value
self.query(f"GO{int(target):02d}", noreply=True)
self.status = BUSY, 'not at target'
self.value = self.read_value()
return target
def go_to_key(self, name):
if name in self.key_positions:
return self.write_target(self.key_positions[name])
else:
raise ValueError("unknown positon: Try the following names:", ", ".join(self.key_positions.keys()))
class SwitchValve(HasIO, Drivable):
# ioClass = ValvesCommunication
value = Parameter('current valve position', IntRange(1, 2))
target = Parameter('target valve position', IntRange(1, 2))
# key_positions = Property('named posiitons', dict, default={"A": 1, "B": 2})
#def initModule(self):
# self.value.datatype = IntRange(1, 2)
# self.target.datatype = IntRange(1, 2)
def query(self, cmd):
return self.communicate(cmd).strip()
def read_value(self):
return int(self.query("CP"))
def read_status(self):
current = self.read_value()
if current == self.target:
return IDLE,"reached target"
else:
return BUSY, "moving to target"
def write_target(self, value):
current = self.read_value()
if current == value:
return current
self.communicate("CP")
return self.read_value()