diff --git a/csaxs_bec/devices/omny/omny_temperatures.py b/csaxs_bec/devices/omny/omny_temperatures.py index b3379cc..fbfb701 100644 --- a/csaxs_bec/devices/omny/omny_temperatures.py +++ b/csaxs_bec/devices/omny/omny_temperatures.py @@ -14,8 +14,12 @@ class OMNYTemperaturesError(Exception): class OMNYTemperatures(Device): USER_ACCESS = [ "if_temperature_controller_used_get_name_and_values", + "set_setpoint", "show_all", "help", + "_set_TEMP_default_setpoints", + "temperature_controller_TEMP_running", + "temperature_controller_CRYO_running", ] SUB_VALUE = "value" _default_sub = SUB_VALUE @@ -46,6 +50,29 @@ class OMNYTemperatures(Device): } temperature_names = Dcpt(temperature_names) + temperature_update_time = Cpt( + EpicsSignal, name="temperature_update_time", read_pv="XOMNY-TEMP:UPDATED.VAL" + ) + + cryo_temperature = { + f"cryo_temperature{i}": (EpicsSignal, f"XOMNY-TEMP-CRYO-{chr(i+ord('A')-1)}:GET.VAL", {}) for i in range(1,5) + } + cryo_temperature = Dcpt(cryo_temperature) + + cryo_temperature_setpoint = { + f"cryo_temperature_setpoint{i}": (EpicsSignal, f"XOMNY-TEMP-CRYO-{chr(i+ord('A')-1)}:SET.VAL", {}) for i in range(1,5) + } + cryo_temperature_setpoint = Dcpt(cryo_temperature_setpoint) + + cryo_temperature_name = { + f"cryo_temperature_name{i}": (EpicsSignal, f"XOMNY-TEMP-CRYO-{chr(i+ord('A')-1)}:GET.DESC", {}) for i in range(1,5) + } + cryo_temperature_name = Dcpt(cryo_temperature_name) + + cryo_temperature_update_time = Cpt( + EpicsSignal, name="cryo_temperature_update_time", read_pv="XOMNY-TEMP-CRYO:UPDATED.VAL" + ) + def __init__(self, prefix="", *, name, **kwargs): super().__init__(prefix, name=name, **kwargs) self.temperature.temperature1.subscribe(self._emit_value) @@ -55,6 +82,84 @@ class OMNYTemperatures(Device): self.wait_for_connection() self._run_subs(sub_type=self.SUB_VALUE, timestamp=timestamp, obj=self) + def set_setpoint(self, type: str, controller_nr: int, temperature: float): + if type == "TEMP": + getattr(self.temperature_setpoint, f"temperature_setpoint{controller_nr}").set(temperature) + + def _set_TEMP_default_setpoints(self): + self.set_setpoint("TEMP",8,-199.9) + time.sleep(0.1) + self.set_setpoint("TEMP",9,23) + time.sleep(0.1) + self.set_setpoint("TEMP",10,73.2) + time.sleep(0.1) + self.set_setpoint("TEMP",16,-199.9) + time.sleep(0.1) + self.set_setpoint("TEMP",17,23) + time.sleep(0.1) + self.set_setpoint("TEMP",18,26) + time.sleep(0.1) + self.set_setpoint("TEMP",19,26) + time.sleep(0.1) + self.set_setpoint("TEMP",20,26) + time.sleep(0.1) + self.set_setpoint("TEMP",21,23) + time.sleep(0.1) + self.set_setpoint("TEMP",22,-199.9) + time.sleep(0.1) + self.set_setpoint("TEMP",23,-199.9) + time.sleep(0.1) + self.set_setpoint("TEMP",24,-199.9) + time.sleep(0.1) + self.set_setpoint("TEMP",25,25) + time.sleep(0.1) + self.set_setpoint("TEMP",27,25) + time.sleep(0.1) + self.set_setpoint("TEMP",28,73.2) + time.sleep(0.1) + self.set_setpoint("TEMP",29,73.2) + time.sleep(0.1) + self.set_setpoint("TEMP",30,73.2) + time.sleep(0.1) + self.set_setpoint("TEMP",31,73.2) + time.sleep(0.1) + self.set_setpoint("TEMP",35,25) + time.sleep(0.1) + self.set_setpoint("TEMP",36,25) + time.sleep(0.1) + self.set_setpoint("TEMP",37,25) + time.sleep(0.1) + self.set_setpoint("TEMP",38,73.2) + time.sleep(0.1) + self.set_setpoint("TEMP",39,73.2) + time.sleep(0.1) + self.set_setpoint("TEMP",41,30) + time.sleep(0.1) + self.set_setpoint("TEMP",42,25) + time.sleep(0.1) + self.set_setpoint("TEMP",44,25) + time.sleep(0.1) + self.set_setpoint("TEMP",45,-199.9) + time.sleep(0.1) + self.set_setpoint("TEMP",46,73.2) + time.sleep(0.1) + self.set_setpoint("TEMP",47,73.2) + time.sleep(0.1) + + def temperature_controller_TEMP_running(self): + time_diff = float(self.temperature_update_time.get()) - time.time() + if time_diff > 600: + return False + else: + return True + + def temperature_controller_CRYO_running(self): + time_diff = float(self.cryo_temperature_update_time.get()) - time.time() + if time_diff > 600: + return False + else: + return True + def if_temperature_controller_used_get_name_and_values(self, type: str, controller_nr: int) -> bool: if type == "TEMP": controller_name = str(getattr(self.temperature_names, f"temperature_name{controller_nr}").get()) @@ -90,6 +195,9 @@ class OMNYTemperatures(Device): # t.header = False # t.vrules = FRAME # print(t) + red = "\x1b[91m" + green = "\x1b[92m" + white = "\x1b[0m" t = PrettyTable() t.clear() t.title = "OMNY Temperature Controllers" @@ -114,6 +222,14 @@ class OMNYTemperatures(Device): t.header = True t.vrules = FRAME print(t) + if not self.temperature_controller_TEMP_running(): + print (red + "Warning: the temperature controller communication is broken" + white) + + for i in range(1,5): + print(float(getattr(self.cryo_temperature, f"cryo_temperature{i}").get())) + + if not self.temperature_controller_CRYO_running(): + print (red + "Warning: the temperature controller communication is broken" + white) print("Use dev.omny_temperatures.help() for assistance.")