From f857f8b8b7300c2b520d48a8d9c70accd2d11aac Mon Sep 17 00:00:00 2001 From: Filip Leonarski Date: Fri, 19 Sep 2025 16:12:20 +0200 Subject: [PATCH] GUI: camera_image.py added BEAMLINE BUSY message when beamline is in use. ALso change colour of the beam centre mark --- gui/src/aaregui/widgets/camera_image.py | 79 +++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/gui/src/aaregui/widgets/camera_image.py b/gui/src/aaregui/widgets/camera_image.py index 79d2e33d..95590971 100644 --- a/gui/src/aaregui/widgets/camera_image.py +++ b/gui/src/aaregui/widgets/camera_image.py @@ -65,6 +65,11 @@ class SampleCameraImageLabel(QGraphicsView): self.__raster_mgr = raster self.__state = SampleCameraImageState.IDLE self.__sam_cam = SampleCameraSettings(exposure=0.1, gain=100.0) + self.__is_daq_busy = False + + self.__busy_blink_timer = QTimer() + self.__busy_blink_timer.timeout.connect(self.__toggle_busy_blink) + self.__busy_blink_visible = True self.__geom = geom self.__bookmarks: SmargonBookmarkList = SmargonBookmarkList() @@ -107,11 +112,71 @@ class SampleCameraImageLabel(QGraphicsView): self.left_click_hold_threshold = 200 self.right_click_hold_threshold = 200 + def __toggle_busy_blink(self): + """Toggle visibility for blinking busy text.""" + self.__busy_blink_visible = not self.__busy_blink_visible + self.update() + + def __draw_busy_overlay(self, painter: QPainter, rect): + """Draw 'BEAMLINE BUSY' text overlay when DAQ is in busy state.""" + if not self.__is_daq_busy: + return + + if not self.__busy_blink_visible: + return + + # Save the current painter state + painter.save() + + # Set up the text properties + font = painter.font() + font.setPointSize(24) + font.setBold(True) + painter.setFont(font) + + # Create a semi-transparent background + painter.setPen(QPen(QColor(255, 255, 255, 200), 2, Qt.PenStyle.SolidLine)) + painter.setBrush(QColor(255, 0, 0, 150)) # Semi-transparent red background + + text = "BEAMLINE BUSY" + + # Calculate text dimensions + font_metrics = painter.fontMetrics() + text_rect = font_metrics.boundingRect(text) + + # Position the text in the center of the view + view_rect = self.viewport().rect() + scene_center = self.mapToScene(view_rect.center()) + + # Create a rectangle for the background + padding = 20 + bg_rect = QRect( + int(scene_center.x() - text_rect.width() / 2 - padding), + int(scene_center.y() - text_rect.height() / 2 - padding), + text_rect.width() + 2 * padding, + text_rect.height() + 2 * padding + ) + + # Draw the background rectangle + painter.drawRoundedRect(bg_rect, 10, 10) + + # Draw the text + painter.setPen(QPen(QColor(255, 255, 255), 2, Qt.PenStyle.SolidLine)) + text_pos = QPoint( + int(scene_center.x() - text_rect.width() / 2), + int(scene_center.y() + text_rect.height() / 4) + ) + painter.drawText(text_pos, text) + + # Restore the painter state + painter.restore() + def drawForeground(self, painter, rect): self.__draw_ml_bounding_box(painter) self.__draw_beam_center(painter) self.__raster_mgr.draw_grid(painter, self.__raster_alpha) self.__draw_helical(painter) + self.__draw_busy_overlay(painter, rect) def resizeEvent(self, event): super().resizeEvent(event) @@ -317,11 +382,22 @@ class SampleCameraImageLabel(QGraphicsView): self.__sam_cam = s.bl.sample_camera self.__bounding_box = s.box + self.__is_daq_busy = s.busy + + if self.__is_daq_busy: + if not self.__busy_blink_timer.isActive(): + self.__busy_blink_timer.start(500) # Blink every 500ms + else: + self.__busy_blink_timer.stop() + self.__busy_blink_visible = True + if s.state == BeamlineStateEnum.BeamLocation: self.__state = SampleCameraImageState.BEAM_MARKING elif self.__state == SampleCameraImageState.BEAM_MARKING: self.__state = SampleCameraImageState.IDLE + self.update() + def __left_single_click(self, event): match self.__state: case SampleCameraImageState.BEAM_MARKING: @@ -365,6 +441,9 @@ class SampleCameraImageLabel(QGraphicsView): if self.__state == SampleCameraImageState.BEAM_MARKING: painter.setPen(QPen(QColor(102, 51, 153), 3, Qt.PenStyle.SolidLine)) + elif self.__is_daq_busy is True: + # Use red color to indicate busy state + painter.setPen(QPen(QColor(255, 0, 0), 3, Qt.PenStyle.SolidLine)) else: painter.setPen(QPen(QColor(245, 121, 0), 3, Qt.PenStyle.SolidLine))