diff --git a/common/src/aaredaqlib/models.py b/common/src/aaredaqlib/models.py index 18950147..6adef796 100644 --- a/common/src/aaredaqlib/models.py +++ b/common/src/aaredaqlib/models.py @@ -691,6 +691,7 @@ class BeamlineStatus(BaseModel): light: Annotated[float, Field(ge=0.0, le=100.0)] cryojet_K: float shutter_open: bool + exp_shutter_open: bool | None flux_ph_s: float sample_camera: SampleCameraSettings transmission: Annotated[float, Field(ge=0.0, le=1.0)] | None diff --git a/daq/src/aaredaq/daq.py b/daq/src/aaredaq/daq.py index 1864771e..f34bb8e4 100644 --- a/daq/src/aaredaq/daq.py +++ b/daq/src/aaredaq/daq.py @@ -800,6 +800,8 @@ class AareDAQ: print(f"!!!!! ABR MAY HAVE DISCONNECTED !!!!!") print(f"!!!!! CHECK ABR EPICS PANEL FOR ERRORS!!!!!") print("!!!!! IF NOT RESTART GUI !!!!!") + print("CLOSING EXPERIMENTAL HUCTH FOR SAFETY") + self.__devs.exp_shutter.close() return SampleGeometryModel( beam_location_pxl=self.__cfg.beam_mark_coeff.apply(zoom), pixel_in_mm=self.__cfg.pixel_to_mm(zoom), @@ -1483,6 +1485,7 @@ class AareDAQ: light=self.light, cryojet_K=self.__devs.cryojet_temp, shutter_open=self.__devs.shutter, + exp_shutter_open=self.__devs.exp_shutter.state(), flux_ph_s=self.__devs.full_flux, sample_camera=self.__devs.samcam_settings, name=self.__bl, diff --git a/daq/src/aaredaq/devices.py b/daq/src/aaredaq/devices.py index 91aa5182..1615b892 100644 --- a/daq/src/aaredaq/devices.py +++ b/daq/src/aaredaq/devices.py @@ -10,6 +10,7 @@ from mxlibs3.area_detector import epicsAD from mxlibs3.enum_pv import EnumPv from mxlibs3.filter_transmission import FilterTransmission from mxlibs3.fluorimeter import Fluorimeter +from mxlibs3.experimental_hutch_shutter import ExperimentalHutchShutter from mxlibs3.my_motor import MyMotor from mxlibs3.non_standard import NonStandard from mxlibs3.tell_client import TellClient @@ -113,6 +114,8 @@ class BeamlineDevices: self.__shutter_rbv = PV(f"{BEAMLINE}-ES-PH1:GET") self.__shutter = PV(f"{BEAMLINE}-ES-PH1:SET") + self.exp_shutter = ExperimentalHutchShutter(beamline) + # xrf_stage = EnumPv( # { # "name": "KetekStage", diff --git a/daq/src/aaredaq/server.py b/daq/src/aaredaq/server.py index 4130c64a..0272a6d6 100644 --- a/daq/src/aaredaq/server.py +++ b/daq/src/aaredaq/server.py @@ -87,6 +87,7 @@ async def status(token: str = Depends(oauth2_scheme)) -> DAQStatusModel: ) except Exception as e: + logger.error(f"Error getting status: {e}") raise HTTPException( status_code=api_status.HTTP_500_INTERNAL_SERVER_ERROR, detail=f"Error getting status: {e}" diff --git a/daq/src/mxlibs3/experimental_hutch_shutter.py b/daq/src/mxlibs3/experimental_hutch_shutter.py new file mode 100644 index 00000000..d7a22c21 --- /dev/null +++ b/daq/src/mxlibs3/experimental_hutch_shutter.py @@ -0,0 +1,32 @@ +from aaredaqlib.beamline import MXBeamline +from epics import PV + +class ExperimentalHutchShutter: + def __init__(self, beamline: MXBeamline): + BEAMLINE = beamline.value.upper() + self.__close= PV(f"{BEAMLINE}-EH1-PSYS:SH-A-CLOSE-SET") # 1, 0 + self.__open = PV(f"{BEAMLINE}-EH1-PSYS:SH-A-OPEN-SET") + self.__state = PV(f"{BEAMLINE}-OP-PSH1-EMLS-0010:OPEN") + + + def state(self): + state = self.__state.get() + if state == "Open" or state == 1: + print(f"Open {state}") + return True + elif state == "Not Open" or state == 0: + print(f"Not Open {state}") + return False + else: + print(ValueError(f"unknown state: {state}")) + return False + + def open(self): + self.__open.put(0) + self.__open.put(1) + #print(self.__open.get()) + self.__open.put(0) + + def close(self): + self.__close.put(1) + self.__close.put(0) \ No newline at end of file diff --git a/gui/src/aaregui/widgets/status_bar.py b/gui/src/aaregui/widgets/status_bar.py index 287aa0ab..4fc1ca07 100644 --- a/gui/src/aaregui/widgets/status_bar.py +++ b/gui/src/aaregui/widgets/status_bar.py @@ -52,12 +52,14 @@ class StatusBar(QStatusBar): self.shutter_label = ClickableLabel(parent=self) self.shutter_label.clicked.connect(self.show_shutter_menu) + self.exp_shutter_label = ValueLabel("ExpHutch Shutter", "", self) self.addPermanentWidget(self.flux) self.addPermanentWidget(self.transmission) self.addPermanentWidget(self.ring_current) self.addPermanentWidget(self.wvl) self.addPermanentWidget(self.cryo_label) self.addPermanentWidget(self.shutter_label) + self.addPermanentWidget(self.exp_shutter_label) self.addPermanentWidget(self.pgroup_label) self.addPermanentWidget(self.pgroup_label) self.addPermanentWidget(self.state_label) @@ -98,6 +100,11 @@ class StatusBar(QStatusBar): else: self.shutter_label.setText(f"""Shutter: Closed 🚪 """) + if status.bl.exp_shutter_open: + self.exp_shutter_label.setText("""ExpHutch Shutter: Open """) + else: + self.exp_shutter_label.setText("""ExpHutch Shutter: Closed 🚪 """) + if status.session.current_pgroup is not None: self.pgroup_label.setText(f"""p-group: {status.session.current_pgroup} """) else: