From 333957adbc05db254ff685836c67ed4e78def781 Mon Sep 17 00:00:00 2001 From: appleb_m Date: Wed, 17 Jun 2026 11:40:11 +0200 Subject: [PATCH] better erro hadnling for status bar --- src/aare/gui/threads/daq_worker.py | 1 + src/aare/gui/widgets/status_bar.py | 154 +++++++++++++++-------------- 2 files changed, 80 insertions(+), 75 deletions(-) diff --git a/src/aare/gui/threads/daq_worker.py b/src/aare/gui/threads/daq_worker.py index 43363426..c37dbab0 100644 --- a/src/aare/gui/threads/daq_worker.py +++ b/src/aare/gui/threads/daq_worker.py @@ -137,6 +137,7 @@ class DAQWorker(QObject): self._status_request_min_interval = 0.5 self._smargon_retry_interval_s = 2.0 self._smargon_log_min_interval_s = 10.0 + self._last_status_can_read: bool | None = None self._device_error_log_min_interval_s = 10.0 self._last_device_error_log_ts: dict[str, float] = {"tell": 0.0, "smargon": 0.0} diff --git a/src/aare/gui/widgets/status_bar.py b/src/aare/gui/widgets/status_bar.py index 14d4751c..75a0e6f4 100644 --- a/src/aare/gui/widgets/status_bar.py +++ b/src/aare/gui/widgets/status_bar.py @@ -132,88 +132,92 @@ class StatusBar(QStatusBar): @Slot(DAQStatusModel) def update_daq_status(self, status: DAQStatusModel): - self.__status = status - if status.bl.flux_ph_s is None: - self.flux.set_value(f"0") - else: - self.flux.set_value(f"{(status.bl.flux_ph_s / 1e9):.0f}") - - if status.bl.transmission is None: - self.transmission.set_value(f"(moving)") - else: - self.transmission.set_value(f"{status.bl.transmission:.5f}") - - if status.bl.ring_current_mA < 5.0: - self.ring_current.set_value(f"{status.bl.ring_current_mA:.2f}", "red") - elif status.bl.ring_current_mA < 390.0: - self.ring_current.set_value(f"{status.bl.ring_current_mA:.2f}", "orange") - else: - self.ring_current.set_value(f"{status.bl.ring_current_mA:.2f}") - - self.wvl.set_value(f"{status.diffraction.wavelength_angstrom:.2f}") - - if status.bl.cryojet_K < 110.0: - self.cryo_label.set_value(f"{status.bl.cryojet_K:.1f}", "blue") - elif status.bl.cryojet_K < 250.0: - self.cryo_label.set_value(f"{status.bl.cryojet_K:.1f}", "orange") - else: - self.cryo_label.set_value(f"{status.bl.cryojet_K:.1f}", "red") - - if status.bl.shutter_open: - self.shutter_label.setText(f"""Shutter: Open ☢️ """) - 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: - self.pgroup_label.setText(f"Inactive p-group ") - - self.state_label.setText(f"""State: {status.state.display_name()} """) - - tell_text = "—" - tell_color = "rgb(55, 67, 87)" - if status.tell_state is not None: - tell_text = status.tell_state.activity.display_name() - - if status.tell_state.activity.value == "error": - tell_color = "red" - elif status.tell_state.activity.value in {"mounting", "unmounting", "drying", "cooling"}: - tell_color = "orange" + try: + self.__status = status + if status.bl.flux_ph_s is None: + self.flux.set_value(f"0") else: - tell_color = "green" + self.flux.set_value(f"{(status.bl.flux_ph_s / 1e9):.0f}") - self.tell_state_label.setText(f"Tell: {tell_text} ") - self.tell_state_label.setStyleSheet(f"color: {tell_color};") + if status.bl.transmission is None: + self.transmission.set_value(f"(moving)") + else: + self.transmission.set_value(f"{status.bl.transmission:.5f}") - if status.busy: - busy_flag = """ Busy 🔒 """ - else: - busy_flag = """ Idle 🔓 """ + if status.bl.ring_current_mA < 5.0: + self.ring_current.set_value(f"{status.bl.ring_current_mA:.2f}", "red") + elif status.bl.ring_current_mA < 390.0: + self.ring_current.set_value(f"{status.bl.ring_current_mA:.2f}", "orange") + else: + self.ring_current.set_value(f"{status.bl.ring_current_mA:.2f}") - html_content = f"""Beamline: {busy_flag} """ + if status.diffraction.wavelength_angstrom: + self.wvl.set_value(f"{status.diffraction.wavelength_angstrom:.2f}") - self.busy_label.setText(html_content) + if status.bl.cryojet_K < 110.0: + self.cryo_label.set_value(f"{status.bl.cryojet_K:.1f}", "blue") + elif status.bl.cryojet_K < 250.0: + self.cryo_label.set_value(f"{status.bl.cryojet_K:.1f}", "orange") + else: + self.cryo_label.set_value(f"{status.bl.cryojet_K:.1f}", "red") - session_flag = "" - if status.session.session == SessionsStateEnum.Vacant: - session_flag = """ Vacant 🔓 """ - elif status.session.session == SessionsStateEnum.OwnedByYou: - session_flag = """ Owned ⬤ """ - elif status.session.session == SessionsStateEnum.OwnedByElse: - session_flag = """ Other 🔒 """ - elif status.session.session == SessionsStateEnum.PendingYouToElse: - session_flag = """ Waiting... ⏳ """ - elif status.session.session == SessionsStateEnum.PendingElseToYou: - session_flag = """ Request! ⚡ """ + if status.bl.shutter_open: + self.shutter_label.setText(f"""Shutter: Open ☢️ """) + else: + self.shutter_label.setText(f"""Shutter: Closed 🚪 """) - html_content_session = f"""Session: {session_flag}""" - self.session_label.setText(html_content_session) + 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: + self.pgroup_label.setText(f"Inactive p-group ") + + self.state_label.setText(f"""State: {status.state.display_name()} """) + + tell_text = "—" + tell_color = "rgb(55, 67, 87)" + if status.tell_state is not None: + tell_text = status.tell_state.activity.display_name() + + if status.tell_state.activity.value == "error": + tell_color = "red" + elif status.tell_state.activity.value in {"mounting", "unmounting", "drying", "cooling"}: + tell_color = "orange" + else: + tell_color = "green" + + self.tell_state_label.setText(f"Tell: {tell_text} ") + self.tell_state_label.setStyleSheet(f"color: {tell_color};") + + if status.busy: + busy_flag = """ Busy 🔒 """ + else: + busy_flag = """ Idle 🔓 """ + + html_content = f"""Beamline: {busy_flag} """ + + self.busy_label.setText(html_content) + + session_flag = "" + if status.session.session == SessionsStateEnum.Vacant: + session_flag = """ Vacant 🔓 """ + elif status.session.session == SessionsStateEnum.OwnedByYou: + session_flag = """ Owned ⬤ """ + elif status.session.session == SessionsStateEnum.OwnedByElse: + session_flag = """ Other 🔒 """ + elif status.session.session == SessionsStateEnum.PendingYouToElse: + session_flag = """ Waiting... ⏳ """ + elif status.session.session == SessionsStateEnum.PendingElseToYou: + session_flag = """ Request! ⚡ """ + + html_content_session = f"""Session: {session_flag}""" + self.session_label.setText(html_content_session) + except Exception as e: + logger.error(f"Error updating DAQ status in status bar: {e}") @Slot(BatonStatus) def update_baton_status(self, status: BatonStatus):